60天刷题记录Day2|滑动窗口(Leetcode 209)、Leetcode 59

148 阅读1分钟

滑动窗口

滑动窗口是双指针的一种,它的思路是:在两个指针中间的区间形成一个窗口[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。当超出边界或者走到的位置有数了就改变方向。