滑动窗口
滑动窗口是双指针的一种,它的思路是:在两个指针中间的区间形成一个窗口[i, j]。j指针向后移动至达到题目中的要求。此时j指针停止移动,i指针开始移动,缩小窗口,直至不满足题中的要求。每次移动i之前都要更新一下结果。如此循环以上操作直到j指针走到尽头。
Leetcode 209. Minimum Size Subarray Sum
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int res = INT_MAX;
for(int i = 0, j = 0, sum = 0; j < nums.size(); j ++){
sum += nums[j];
while(target <= sum){
res = min(res, j - i + 1);
sum -= nums[i ++];
}
}
if(res == INT_MAX) return 0;
return res;
}
};
Leetcode 59. Spiral Matrix II
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n, vector<int>(n));
int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};
for(int i = 1, x = 0, y = 0, d = 0; i <= n * n; i ++){
res[x][y] = i;
int a = x + dx[d], b = y + dy[d];
if(a < 0 || a >= n || b < 0 || b >=n || res[a][b]){
d = (d + 1) % 4;
a = x + dx[d], b = y + dy[d];
}
x = a, y = b;
}
return res;
}
};
对矩阵建立一个直角坐标系,向下为x轴,向右为y轴。那么向右移动一格的位移是(0,1),向下移动一格的位移是(1,0),向左移动一格的位移是(0,-1),向上移动一格的位移是(-1,0)。由此列出方向数组。对这四个方向设为变量d,根据旋转的顺序分别为0,1,2,3。当超出边界或者走到的位置有数了就改变方向。