977. 有序数组的平方
双指针,首尾指针,因为数组有序且有负数,所以数组的平方值在收尾两边之一取最大,然后其中一个指针向对应的方向移动即可。
vector<int> sortedSquares(vector<int>& nums) {
vector<int> res(nums.size(),0);
for(int l=0,r=nums.size()-1,pos=nums.size()-1;l<=r;)
{
if(nums[l]*nums[l]>nums[r]*nums[r])
{
res[pos] = nums[l]*nums[l];
++l;
}
else
{
res[pos] = nums[r]*nums[r];
--r;
}
--pos;
}
return res;
}
滑动窗口
滑动窗口法因为只遍历一遍数组所以一般情况下复杂度为 O (N)。
需要注意的点:
1.本类问题的代码关键是根据题目得出窗口收缩的时机,以及想清楚窗口收缩后应该干什么,用while还是if
2.窗口的增大一般是用for循环来向后走
3.同时也要考虑需不需要其他数据结构辅助保存一些需要的数据
int slidingwindow(int K, vector<int>& arr) {
vector<double> result(arr.size() - K + 1);
int left= 0;
for (int right= 0; right< arr.size(); right++) {
if ()//关键在于窗口收缩的时机,判断逻辑while或者if
{
left++;//窗口收缩一般是指窗口头部向前移动,此时要更新与窗口头部相关的数据结构如map等
}
}
return result;
}
int minSubArrayLen(int target, vector<int>& nums) {
int left=0,right=0;
int minlen=INT_MAX;
int sum=0;
for(right=0 ;right<nums.size();++right)
{
sum+=nums[right];
while(sum >= target)
{
minlen=min(minlen,right-left+1);
sum-=nums[left];
++left;
}
}
return minlen == INT_MAX ? 0:minlen;
}
模拟类题目
59. 螺旋矩阵 II
笔试很多模拟类题目比较考验功底