题目链接:977.有序数组的平方
思路:因为是有序数组,所以最大值肯定从两头开始找.利用双指针每次比较一头一尾,然后移动指针,遍历完整个数组。
代码:
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int n=nums.size();
int k=n-1;
vector<int> res(n,0);
for(int i=0,j=n-1;i<=j;){
if(nums[i]*nums[i]>nums[j]*nums[j]){
res[k--]=nums[i]*nums[i];
i++;
}
else{
res[k--]=nums[j]*nums[j];
j--;
}
}
return res;
}
};
题目链接:209.长度最小的子数组
思路:滑动窗口取最小长度。
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int sum=0;
int left=0;
int len=INT32_MAX;
int sublen=0;
for(int i=0;i<nums.size();i++){
sum+=nums[i];
while(sum>=target){
sublen=i-left+1;
if(sublen<len){
len=sublen;
}
sum-=nums[left];
left++;
}
}
return len==INT32_MAX?0:len;
}
};
题目链接:59.螺旋矩阵II
思路:模拟,先往右走,往下走,往左走,往上走,四个变量控制上下左右的边界。不需要设置loop,直接用count<=n*n来控制循环。
代码:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int top=0;
int bottom=n-1;
int left=0;
int right=n-1;
int count=1;
vector<vector<int>> res(n,vector<int>(n,0));
while(count<=n*n){
for(int i=left;i<=right;i++){
res[top][i]=count++;
}
top++;
for(int i=top;i<=bottom;i++){
res[i][right]=count++;
}
right--;
for(int i=right;i>=left;i--){
res[bottom][i]=count++;
}
bottom--;
for(int i=bottom;i>=top;i--){
res[i][left]=count++;
}
left++;
}
return res;
}
};