代码随想录第二天|977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II
题目链接:
双指针问题,前后各指向一个元素,比较大小,大的就放里面,移动指针,最后直到所有的元素放在新的vector中返回
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int len=nums.size();
int l=0;
int r=len-1;
vector<int> res(len,0);
int loop=len-1;
while(l<=r){
if(nums[l]*nums[l]>nums[r]*nums[r]){
res[loop--]=nums[l]*nums[l];
l++;
}else{
res[loop--]=nums[r]*nums[r];
r--;
}
}
return res;
}
};
滑动窗口(尺取法):
首先左边不动,右边开到最大使这个区间符合条件,然后缩小左边,缩小到不符合条件就扩大右边,直到右边碰到了边界停止。
第一个循环控制右边界的大小,内层循环表示当达到条件后缩小窗口。
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int sum=0;
int l=0;
int res=INT_MAX;
int sublen=INT_MAX;
for(int j=0;j<nums.size();j++){
sum=sum+nums[j];
while(sum>=target){
sublen=j-l+1;
res = res < sublen ? res : sublen;
//res=min(res,sublen);
sum -= nums[l++];
}
}
return res==INT_MAX?0:res;
}
};
中间元素单独处理,每一圈控制好前后位置,比如4×4,最外层循环只改变三个量,达到四个步骤的均衡。
每一层控制缩圈边界减一,起始位置都加一。
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n, vector<int>(n, 0));
int startx = 0, starty = 0; // 圈的起始位置
int loop = n / 2; // 每个圈循环几次,单独处理中间值
int mid = n / 2; // 矩阵中间的位置
int count = 1; // 用来给矩阵中每一个空格赋值
int offset = 1; // 需要控制每一条边遍历的长度,每次循环右边界收缩一位
int i,j;
while (loop --) {
i = startx;
j = starty;
// 下面开始的四个for就是模拟转了一圈
// 模拟填充上行从左到右(左闭右开)
for (j; j < n - offset; j++) {
res[i][j] = count++;
}
// 模拟填充右列从上到下(左闭右开)
for (i; i < n - offset; i++) {
res[i][j] = count++;
}
// 模拟填充下行从右到左(左闭右开)
for (; j > starty; j--) {
res[i][j] = count++;
}
// 模拟填充左列从下到上(左闭右开)
for (; i > startx; i--) {
res[i][j] = count++;
}
// 第二圈开始的时候,起始位置要各自加1
startx++;
starty++;
offset += 1;
}
// 如果n为奇数的话,需要单独给矩阵最中间的位置赋值
if (n % 2) {
res[mid][mid] = count;
}
return res;
}
};