这道题采用双指针的方法从两边往中间,有点类似于归并排序,两边正负数组可以看做是两个已经有序的数组,往中间走也是排序的过程
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int left = 0;
int right = nums.size()-1;
vector<int> ans(right+1);
int now = nums.size()-1;
while(now>=0)
{
if(nums[left]*nums[left]>nums[right]*nums[right])
{
ans[now] = nums[left]*nums[left];
now--;
left++;
}
else
{
ans[now] =nums[right]*nums[right];
now--;
right--;
}
}
return ans;
}
};
leetcode 209.长度最小的子数组
这道题的思路是滑动窗口,先不断右移右指针尽可能满足条件,之后不断右移左指针缩小窗口看是否能继续满足条件
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int sum = 0;
int res = 100005;
int len = nums.size();
int l=0;
for(int r =0;r<len;r++)
{
sum+=nums[r];
while(sum>=target)
{
res = min(res,r-l+1);
sum-= nums[l];
l++;
}
}
return res==100005? 0:res;
}
};
59.螺旋矩阵II
纯模拟题,但是要注意是遍历每条边的时候是左闭右开,保持一致,最后特判中间是否需要填充
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> ans(n,vector<int>(n,0));
int nowr=0,nowc=0;
int rside=0,lside=n-1;
int now=1;
while(rside<lside)
{
nowr = nowc = rside;
for(nowc;nowc<lside;nowc++)
{
ans[nowr][nowc] = now++;
}
//if(now>n*n) break;
for(nowr;nowr<lside;nowr++)
{
ans[nowr][nowc] = now++;
}
for(nowc;nowc>rside;nowc--)
{
ans[nowr][nowc] = now++;
}
for(nowr;nowr>rside;nowr--)
{
ans[nowr][nowc] = now++;
}
rside++;
lside--;
}
if(n%2) ans[n/2][n/2] = now;
return ans;
}
};
数组专题总结
定义区间时要明确是左闭右开还是全闭,要明确区间定义才方便做题,双指针和滑动窗口在数组里很常用