209.长度最小的子数组
1.题目链接:209.mininum-size-subarray- 力扣(LeetCode)
2.解题关键:
--滑动窗口的思路:
(1)设置左右两个指针,构成一个窗口。左右两个指针初始值都是0。
(2)移动右指针,直到窗口内和大于等于target,得到第一个有效窗口及窗口长度。
(3)移动左指针,直到窗口内和小于target,移动过程中同时更新最小窗口长度。
(4)重复上述2/3操作,直至数组遍历完成。
3.代码示例:
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int left = 0;
int right = 0;
int subarray_nums = 0;
int length = INT32_MAX;
for(int right = 0; right < nums.size(); right++)
{
subarray_nums += nums[right];
while(subarray_nums>=target)
{
length = (right - left + 1)<length ? (right - left + 1) : length;
subarray_nums -= nums[left];
left += 1;
}
}
return length == INT32_MAX ? 0: length;
}
};
59.螺旋矩阵II
1.题目链接:59.spiral-matrix-ii - 力扣(LeetCode)
2.解题关键:
--n为奇数时需要特殊处理中间一个值
--起始位置:(0,0)、(1,1)、(2、2)……
--每一圈的处理长度:n-1、n-2、n-3……
--共需处理的圈次:n/2
3.代码示例:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector <int>> res(n, vector <int>(n, 0));
int startx = 0;
int starty = 0;
int loop = n/2;
int cur_length = n - 1;
int cur_val = 1;
while(loop--)
{
int i = startx;
int j = starty;
for(j; j < cur_length;j++){
res[i][j] = cur_val++;
}
for(i; i < cur_length; i++){
res[i][j] = cur_val++;
}
for(;j > starty; j--){
res[i][j] = cur_val++;
}
for(;i > startx; i--){
res[i][j] = cur_val++;
}
startx++;
starty++;
cur_length -= 1;
}
if (n%2){
res[n/2][n/2] = cur_val;
}
return res;
}
};