本节第二题第一次在数组中涉及到滑动窗口的概念,也是双指针的一种变形模式
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
/*
排序
if(!nums.size()) return {};
int slow=0;
for(int fast=0;fast<nums.size();fast++){
nums[slow++]=nums[fast]*nums[fast];
}
sort(nums.begin(),nums.end());
return nums;
*/
//双指针(头尾指针)
int L=0;
int R=nums.size()-1;
int k=nums.size()-1;
vector<int>res(nums.size(),0);
while(L<=R){
if(nums[L]*nums[L]<nums[R]*nums[R]){
res[k--]=nums[R]*nums[R];
R--;
}
else{
res[k--]=nums[L]*nums[L];
L++;
}
}
return res;
}
};
class Solution {
public:
//双指针是滑动窗口的基础
int minSubArrayLen(int target, vector<int>& nums) {
int res=INT_MAX;
int sum=0;
int start=0;
//窗口大小为[start,end],用start,end来调节窗口的大小
for(int end=0;end<nums.size();end++){
sum+=nums[end];
//当sum>=target就可以缩小窗口了,缩小窗口用start++
while(sum>=target){
//每次取当前窗口下的大于target的最小连续子数组的最小值
res=min(res,end-start+1);
sum-=nums[start];
start++;
}
}
return res==INT_MAX? 0:res;
}
};