代码随想录算法训练营第二天| 977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II

41 阅读1分钟

题目链接: 977.有序数组的平方 | 209.长度最小的子数组 | 59.螺旋矩阵II

文章讲解: 977.有序数组的平方 | 209.长度最小的子数组 | 59.螺旋矩阵II

视频讲解: 977.有序数组的平方 | 209.长度最小的子数组 | 59.螺旋矩阵II

  • 做题结果:977和209有思路,59拆不出要模拟的每一步

  • 踩坑:直接用Array(n).fill(Array(n))创建出的二维数组由于引用地址一致导致改一个数组元素全部子数组的对应元素都变

var sortedSquares = function(nums) {
    let i=0, j=nums.length-1;
    const res = Array(nums.length).fill(0);

    for (let m=nums.length-1; m>=0; m--) {
        const i2 = nums[i] * nums[i];
        const j2 = nums[j] * nums[j];

        if (i2 > j2) {
            res[m] = i2;
            i++;
        } else {
            res[m] = j2;
            j--;
        }
    }

    return res;
};
var minSubArrayLen = function(target, nums) {
    let res = nums.length + 1, sum=0;

    for (let i=0, j=0; j<nums.length; j++) {
        sum += nums[j];
        while(sum >= target) {
            sum -= nums[i];
            res = res > (j-i+1) ? (j-i+1) : res;
            i++
        }
    }

    return res === nums.length + 1 ? 0 : res;
};

var generateMatrix = function(n) {
    const res = Array.from(new Array(n), () => new Array(n).fill(0))
    const mid = Math.floor(n/2);
    let loop = Math.floor(n/2);
    let offset = 1;
    let cnt = 1;
    let x=0, y=0;
    let i=null, j=null;

    while (loop--) {
        i=x, j=y;

        for (j=y; j<n-offset; j++, cnt++) {
            res[i][j] = cnt;
        }

        for (i=x; i<n-offset; i++, cnt++) {
            res[i][j] = cnt;
        }

        for (;j>y; j--, cnt++) {
            res[i][j] = cnt;
        }

        for(;i>x; i--, cnt++) {
            res[i][j] = cnt;
        }

        offset++;
        x++;
        y++;
    }
    
    if (n % 2) {
        res[mid][mid] = cnt;
    }

    return res;
};