【前端er每日算法】数组59螺旋数组-209滑动窗口

71 阅读2分钟

题目一 59. 螺旋矩阵 II

思路

题目是要模拟二维数组的赋值,循环一圈一圈的去赋值,需要注意的点:

  1. 计算转几圈: n / 2取整即为圈数,这里需要注意的是,如果是奇数,最后复制完后,需要将最中心的点进行赋值,偶数的话就不需要了。
  2. 每个方向的模拟需要有一个准则,都一条边都负责左闭右开的区间, 否则操作可能会乱掉。

解题

/**
 * @param {number} n
 * @return {number[][]}
 */
var generateMatrix = function(n) {
    const arr = new Array(n).fill(0).map(item => new Array(n).fill(0));
    let startX = 0;
    let startY = 0;
    let offset = 1;
    let count = 1;
    let circle = parseInt(n / 2, 10);
    while (circle--) {
        let i = startY;
        let j = startX;
        for (;j < n - offset; j++) {
            arr[i][j] = count++;
        }
        for (;i < n - offset; i++) {
            arr[i][j] = count++;
        }
        for (; j > startY; j--) {
            arr[i][j] = count++;
        }
        for (; i > startY; i--) {
            arr[i][j] = count++;
        }
        startX++;
        startY++;
        offset++;
    }
    if (n % 2 === 1) {
        const center = parseInt(n / 2, 10);
        arr[center][center] = count;
    }
    return arr;
};

题目二 209. 长度最小的子数组

思路

滑动数组的思想,对结果指针遍历,如果小于target,持续遍历,如果遇到了大于target的元素,则循环的将初始位置的index往后+1,并且不断计算最小长度。要注意的点:

  1. sum可以等于target
  2. 长度是j - i + 1
var minSubArrayLen = function(target, nums) {
    let sum = 0;
    let minLen = Infinity;
    let i = 0;
    for (let j = 0; j < nums.length; j++) {
        sum += nums[j];
        while (sum >= target) {
            minLen = Math.min(j - i + 1, minLen);
            sum -= nums[i];
            i++;
        }
    }
    return minLen === Infinity ? 0 : minLen;
};

题目三 977. 有序数组的平方

思路

两端的数值的平方一定是最大的,使用2个指针,分别从前和后遍历,比较当前的值,将大的插入,对应的索引++或者--。

var sortedSquares = function(nums) {
    const len = nums.length;
    const result = new Array(len);
    let index = len - 1;
    let i = 0;
    let j = len - 1;
    while (i <= j) {
        const squareI = nums[i] * nums[i];
        const squareJ = nums[j] * nums[j];
        if (squareI > squareJ) {
            result[index--] = squareI;
            i++;
        } else {
            result[index--] = squareJ;
            j--;
        }
    }
    return result;
};

总结

数组的题目只有5道,做一个总结,数组中利用双指针的场景还是挺多的。

数组.png