有序数组的平方
这是一个什么样的问题?
一串有正有负的有序数组,要求在o(n)的时间复杂度下完成将其中的每个项平方之后再排序
问题解决的思路是什么?
逻辑思路
双指针法,最左边一个指针,最右边一个指针,比较大小,谁大放在新的数组最后,放了之后对应的指针发生移动,就这样直到移动到两个指针重合,不过这种情况下也需要吧两个指针同时指向的那个数放进数组中。
代码思路
一个while循环一直转,当两个指针重合的时候跳出,或者说左指针的位置在右指针右边的时候退出循环,循环中判断左右指针的值那个比较大,大的那个值放在数组的最后。当然宝贝千万别忘了判断特殊情况,当数组只有一个数或者是个空数组的情况单独讨论一下。
代码
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int left = 0;
int right = nums.size() - 1;
int j = right;
vector<int> result(nums.size(), 0);
while(left <= right) {
if(nums[left] * nums[left] > nums[right] * nums[right]) {
result[j--] = nums[left] * nums[left];
left++;
}
else {
result[j--] = nums[right] * nums[right];
right--;
}
}
return result;
}
};
语法
如何给vector赋初值,一个圆括号,里面两个参数,第一个参数写元素个数,第二个参数写元素的初值。
长度最小的子数组
这是一个什么样的问题?
给定一个含有n个正整数的数组和一个正整数target,找出其中数组中每个元素之和大于等于target的子数组,返回其长度,如果没有就返回0.
问题解决的思路是什么?
逻辑思路
双指针法,一个快指针一个慢指针,两个指针之间所有的数的和小于target了快指针就向前,大了慢指针向前一个,sum永远是两个指针之间的和,但不是用循环加的,是sum动态变化。if判断之后执行的sum+=和sum-=
代码思路
一个循环循环的是快指针,到数组长度为止,result返回的为slow与fast之间数距离 + 1,每次取个最小值就行,fast指向的数在fast每次更新的时候固定加到sum上,for循环中有个while循环让数组和知道小于target之后退出循环
代码
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int fast = 0;
int slow = 0;
int sum = 0;
int result = nums.size() + 1;
for (fast; fast < nums.size(); fast++) {
sum += nums[fast];
while(sum >= target) {
sum -= nums[slow];
result = min(result, fast - slow + 1);
slow++;
}
}
if (result == nums.size() + 1) return 0;
return result;
}
};
逻辑小思路
取最小值的过程中,为了让初始值不影响判断,定一个远超可能交过范围的一个数。