Leetcode: 977. 有序数组的平方
本题解题思路为双指针, left 指针需要,指向负数中的最大值的下标,而right指针需要指向非负数的最小值的指标。
同时需要注意条件left与right初始值,及while 循环条件。
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int>n;
int l = -1;
int r = nums.size() - 1;
for (int i = 0; i < nums.size(); i++) {
if (nums[i] < 0) {
l = i;
} else {
break;
}
}
r = l + 1;
while(l >=0 || r < nums.size()) {
if (l = -1) {
n.push_back(nums[r] * nums[r]);
r++;
} else if (r == nums.size()) {
n.push_back(nums[l] * nums[l]);
l--;
} else if (nums[l] * nums[l] < nums[r] * nums[r]) {
n.push_back(nums[l] * nums[l]);
l--;
} else {
n.push_back(nums[r] * nums[r]);
r++;
}
}
return n;
}
};
leetcode:209. 长度最小的子数组
本题主要思路是滑动窗口,窗口右侧不断增加求和,当和大于目标值时需要不断缩小窗口左侧不断的保存窗口的最小值。
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
if (nums.size() == 0) return 0;
int winl = 0;
int winr = 0;
int sum = 0;
int minlen = INT_MAX;
while (winr < nums.size() ) {
sum += nums[winr];
while(sum >= target){
minlen = min(minlen, winr - winl + 1);
sum -= nums[winl];
winl++;
}
winr++;
}
return minlen == INT_MAX ? 0 : minlen;
}
};
leetcode: 59. 螺旋矩阵 II
需要记住一个重要点,就是左闭右开----假设一边有4个格子,那每操作一个边时只赋值前3个。
别忘了保存n,用于最后中心点的判断及赋值。
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> matrix(n,vector<int>(n,0));
int save = n;
int startx = 0;
int starty = 0;
int num = 1;
int loop = n/2;
while(loop --) {
int i = startx;
int j = starty;
//up
for (i; i < n -1 ; i++) {
matrix[j][i] = num;
num++;
}
//right
for(j; j < n -1; j++){
matrix[j][i] = num;
num++;
}
//down
for(i; i > startx; i--) {
matrix[j][i] = num;
num++;
}
//left
for(j; j > starty; j--) {
matrix[j][i] = num;
num++;
}
n--;
startx++;
starty++;
}
if (save % 2 !=0) {
matrix[save/2][save/2] = num;
}
return matrix;
}
};