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

56 阅读1分钟

977.有序数组的平方

1双指针法

  • [√] 二刷
/**
 * @param {number[]} nums
 * @return {number[]}
 */
var sortedSquares = function(nums) {
    // 双指针
    let i = 0, j = nums.length - 1, k = nums.length - 1;
    let res = new Array(nums.length);
    while (i <= j) {
        if (nums[i] * nums[i] < nums[j] * nums[j]) {
            res[k] = nums[j] * nums[j];
            k--;
            j--;
        } else {
            res[k] = nums[i] * nums[i];
            k--;
            i++;
        }
    }
    return res;
};

2平方+排序

复杂度O(logn + n)

209.长度最小的子数组

滑动窗口法

要点是j是结尾指针,以及i的移动方式

/**
 * @param {number} target
 * @param {number[]} nums
 * @return {number}
 */
var minSubArrayLen = function(target, nums) {
    // 滑动窗口法
    let size = nums.length;
    let sum = 0, sublength = 0, i = 0, res = Number.MAX_VALUE;
        for (j = 0; j < size; j++) {
        sum += nums[j];
        while (sum >= target) {
            sublength = j - i + 1;
            res = res < sublength ? res : sublength;
            sum -= nums[i];
            i++;
        }
    }
    return res === Number.MAX_VALUE ? 0 : res;

};

59.螺旋矩阵II

模拟 边界判断

之前出错在中心元素的坐标上

/**
 * @param {number} n
 * @return {number[][]}
 */
var generateMatrix = function(n) {
    let startX = 0, startY = 0;
    let i = 0, j = 0;
    let count = 1;
    let loop = Math.floor(n / 2);
    let offset = 1;
    let res = new Array(n).fill().map(() => new Array(n).fill(0));

    while (loop--) {
        i = startX, j = startY;
        // 上
        for (; j < n - offset; j++) {
            res[i][j] = count++;
        }
        // 右
        for (; i < n - offset; i++) {
            res[i][j] = count++;
        }
        // 下
        for (; j > startY; j--) {
            res[i][j] = count++;
        }
        // 左
        for (; i > startX; i--) {
            res[i][j] = count++;
        }
        startX++;
        startY++;
        offset++;
    }

    if (n%2 === 1) {
        res[startX][startY] = count;
    }

    return res
};