文章目录
由于平方后两边的元素最大,中间的元素最小,所以可以使用双指针。

int* sortedSquares(int* nums, int numsSize, int* returnSize){
int left = 0;
int right = numsSize - 1;
int* res = (int*)malloc(sizeof(int) * numsSize);
*returnSize = 0;
//数组平方
for (int i = 0; i < numsSize; i++)
nums[i] *= nums[i];
while (left <= right)
{
if (nums[left] > nums[right])
res[numsSize - 1 - (*returnSize)++] = nums[left++];
else
res[numsSize - 1 - (*returnSize)++] = nums[right--];
}
return res;
}

这道题目暴力解法当然是 两个for循环,然后从整个数组头不断的寻找符合条件的子序列,时间复杂度很明显是O(n^2)。
int minSubArrayLen(int target, int* nums, int numsSize) {
//暴力:
int subSum = 0;//记录子串和
int sublen = 0;//记录子串长度
int res = INT_MAX;
for (int i = 0; i < numsSize; i++)//循环变量记录子串头
{
subSum = 0;//每一次子串头更新时字串和更新为0
for (int j = i; j < numsSize; j++)//循环变量记录子串尾
{
subSum += nums[j];
if (subSum >= target)//子串和超过目标值
{
sublen = j - i + 1;//统计子串长度
res = res < sublen ? res : sublen;//记录最短字串长度
break;//找到最短长度后直接break
}
}
}
//最短字串长度没有改变的话说明不存在子数组满足条件
return res == INT_MAX ? 0 : res;
}
滑动窗口,就是不断条件子串的起始位置和结束位置,从而得出我们想要的结果。
暴力解法中使用了两层for循环,而滑动窗口只使用一层for循环完成了两层循环所做的事,所以请思考滑动窗口的一层for循环中的循环变量代表着什么?循环变量代表的是窗口(子串)的尾点
问题就是如何表示滑动窗口的起始位置?
这里还是以题目中的示例来举例,s=7, 数组是 2,3,1,2,4,3,来看一下查找的过程

最后找到3 4是最短子串
这个思路的关键三个点就是
int minSubArrayLen(int target, int* nums, int numsSize) {
//滑动窗口
int subSum = 0;//记录子串和
int res = INT_MAX;
int sublen = 0;//记录子串长度
int i = 0;//记录滑动窗口起始位置
for (int j = 0; j < numsSize; j++)//循环变量是滑动窗口结束位置
{
subSum += nums[j];//统计子串和
//子串和大于等于target
while (subSum >= target)
{
sublen = j - i + 1;//字串长度
subSum -= nums[i];//字串和减去窗口当前起始位置的值
i++;//窗口起始位置向前滑动一个位置
res = res < sublen ? res : sublen;//记录最小字串长度
}
}
return res == INT_MAX ? 0 : res;//res没变表示不存在这样的子串
}

很容易观察到矩阵的值是随着每一圈而增加的,所以我们可以外面一个大的循环表示循环的圈数,至于每一圈怎么处理是我们要讨论的重点
我们可以通过每次处理一个方向的数据是左闭右开的来保证每个方向处理到的数据不会有重复,而我们在处理过程中是一定要执行这个左闭右开的原则,这就是循环不变量

int** generateMatrix(int n, int* returnSize, int** returnColumnSizes){
//初始化返回的结果数组的大小
*returnSize = n;
*returnColumnSizes = (int*)malloc(sizeof(int) * n);
//初始化返回结果数组ans
int** martix = (int**)malloc(sizeof(int*) * n);
int i;
for(i = 0; i < n; i++) {
martix[i] = (int*)malloc(sizeof(int) * n);
(*returnColumnSizes)[i] = n;
}
int loop = n / 2;//循环loop圈
int curNum = 1;//当前填充值
for (int count = 0; count < loop; count++)
{
//初始化一圈的开始坐标
int i = count, j = count;
//保持左闭右开的原则从左向右赋值
for ( ; j < n - 1 - count; j++) martix[i][j] = curNum++;
//保持左闭右开的原则从上向下赋值
for ( ; i < n - 1 - count; i++) martix[i][j] = curNum++;
//保持左闭右开的元组从右向左赋值
for ( ; j > count; j--) martix[i][j] = curNum++;
//保持左闭右开的原则从下向上赋值
for ( ; i > count; i--) martix[i][j] = curNum++;
}
//填充奇数圈正中间的值
if (n % 2 == 1) martix[loop][loop] = curNum++;
return martix;
}

在我的Rails(2.3,Ruby1.8.7)应用程序中,我需要将字符串截断到一定长度。该字符串是unicode,在控制台中运行测试时,例如'א'.length,我意识到返回了双倍长度。我想要一个与编码无关的长度,以便对unicode字符串或latin1编码字符串进行相同的截断。我已经了解了Ruby的大部分unicode资料,但仍然有些一头雾水。应该如何解决这个问题? 最佳答案 Rails有一个返回多字节字符的mb_chars方法。试试unicode_string.mb_chars.slice(0,50)
我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby数组,我们在StackOverflow上找到一
在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has
我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]
我正在使用puppet为ruby程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat