打卡-算法训练营-Day2 | 209.长度最小的子数组,59. 螺旋矩阵 II

105 阅读1分钟

滑动窗口

leetcode链接:leetcode.cn/problems/mi…

看到题目想到的就是暴力解法,不过暴力写法也是写的有点磕磕绊绊的,提交上去还超时了。。。

滑动窗口可以理解为是一种双指针

Day1中的移除元素中就说过,双指针一定要明确两个指针分别代表的作用 (我就是没彻底理解,导致代码写不出来),以及for循环使用哪个指针做索引

两个指针的作用:

起始指针:慢慢靠近结束指针,找到长度最小的子数组的开始下标

结束指针:找到符合条件的子数组的末尾下标

螺旋矩阵

leetcode链接:leetcode.cn/problems/sp…

卡哥在题目中明确提示了用到了二分搜索中提到的区间定义,那就左闭右闭和左闭右开

顺着左闭右开的思路,可以明确知道绕一圈,有四段区间要处理

image.png

开始的时候,没考虑到奇数要处理,看了卡哥的开头视频讲解后,这道题目就AC了

不过我的模拟过程和卡哥不太一样,周末研究下两者的区别吧

var generateMatrix = function(n) {
    let k = 1;

    // 创建一个空的二维数组
    let nums = new Array(n).fill(0);
    const matrix = nums.map((item) => item = new Array(n).fill(0));

    for (let offset = 0;offset < n - 1; offset++) {
        let i = offset;
        let j = offset;

        while (i === offset && j < n - 1 - offset) {
            matrix[i][j] = k++;
            j++;
        }

        while (i < n - 1 - offset && j === n - 1 - offset) {
            matrix[i][j] = k++;
            i++;
        }

        while (i === n - 1 - offset && (offset < j && j <= n - 1 - offset)) {
            matrix[i][j] = k++;
            j--;
        }

        while ((offset < i && i <= n - 1 - offset) && j === offset) {
            matrix[i][j] = k++;
            i--;
        }
    }
    if (n % 2 === 1) {
        mid = Math.floor(n/2);
        matrix[mid][mid] = k;
    }

    return matrix;
};