有序数组的平方
题目描述:
一个非递减数组nums,返回每个数字平方的新数组,也要求非递减。
个人刚开始思路:先把数组中的每个元素平方在快速排序,跟卡哥的思路一样;这样的结果
时间复杂度是:O(log(n )+n),快排logn+遍历变成平方n
也就是暴力排序:
题解指出:因为新数组也是非递减的,新元素来自于原数组最大的元素或者原数组最小的元素(负数最小,平方可能就是最大);
所以用双指针法i、j,i指向数组最左边(也就是最小元素),j指向数组最右边(也就是最大元素),在用k指针指向result数组终止位置(卡哥给的是k指向新数组终止位置,然后递减忘前遍历,这里我想试试k指向新数组起始位置然后递增,一会试验结果)
核心代码如下:6~13行
此题相对简单,猜测有进阶版本;
力扣题目209 长度最小的子数组
描述:一个含有n个正整数的数组,和一个正整数s,找出该数组中其和>=s的最小连续子数组,并返回其长度。如果没有符合的,返回0。
个人思路:暴力法:两层for循环,一层遍历数组,一层得到连续子数组之和在此比较,然后得出结果。时间复杂度:O(n*2);此种解法时间复杂度太高,可以改进用一层for循环解决,所以引出双指针法。
卡哥思路:双指针法(滑动窗口)
求最小连续子数组,还是一层for循环 ,然后不断调整窗口位置(保证内部符合题目要求);
窗口的起始位置如何移动:如果当前窗口的值大于s了,窗口就要向前移动了(也就是该缩小了)。
窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。
精髓代码: sum -=nums[i++];
具体细节如9行的让数组累加;
13行的result语法
14行的精髓代码,这里是已经找到符合的连续子序列,但不一定是最小的,所以通过动态变化来寻找到最小的。
最小:体现在起始指针要遍历完数组找到;连续也是
此题需要多多复习!是一道理解双指针的好题。
()