LeetCode刷题-Day2

336 阅读1分钟

977.有序数组的平方

关键点

有序数组中,平方最大的值只可能出现在左右两端。

题解

var sortedSquares = function(nums) {
    // 头尾指针:
    // 由于数组本身是有序的,只是负数平方后变大,所以最大值只可能在数组两端
    let left = 0, right = nums.length - 1, res = [];
    while(left <= right) {
        if(Math.abs(nums[left]) <= Math.abs(nums[right])) {
            res.unshift(nums[right] * nums[right]);
            right--;
        } else {
            res.unshift(nums[left] * nums[left]);
            left++
        }
    }
    return res;
};

209.长度最小的子数组

关键点

滑动窗口: 代码随想录 (programmercarl.com)

题解

var minSubArrayLen = function(target, nums) {
    // // 法一:暴力法
    // let res = Infinity;
    // for(let i = 0; i < nums.length; i++) {
    //     let sum = 0;
    //     for(let j = i; j < nums.length; j++) {
    //        sum += nums[j];
    //        if(sum >= target) {
    //            res = Math.min(res, j - i + 1);
    //        }
    //     }
    // }
    // return res == Infinity ? 0 : res;
    // 法二:滑动窗口
    let res = Infinity;
    let left = right = 0;
    let sum = 0;
    while(right < nums.length) {
        if(sum + nums[right] >= target) {
            res = Math.min(res, right - left + 1);
            sum -= nums[left];
            left++;
        } else {
            sum += nums[right];
            right++;
        }
    }
    return res == Infinity ? 0 : res;
};

59.螺旋矩阵II

关键点

题解

var generateMatrix = function(n) {
    let startX = startY = 0;   // 起始位置
    let loop = Math.floor(n/2);   // 旋转圈数
    let mid = Math.floor(n/2);    // 中间位置
    let offset = 1;    // 控制每一层填充元素个数
    let count = 1;     // 更新填充数字
    let res = new Array(n).fill(0).map(() => new Array(n).fill(0));

    while (loop--) {
        let row = startX, col = startY;
        // 上行从左到右(左闭右开)
        for (; col < startY + n - offset; col++) {
            res[row][col] = count++;
        }
        // 右列从上到下(左闭右开)
        for (; row < startX + n - offset; row++) {
            res[row][col] = count++;
        }
        // 下行从右到左(左闭右开)
        for (; col > startY; col--) {
            res[row][col] = count++;
        }
        // 左列做下到上(左闭右开)
        for (; row > startX; row--) {
            res[row][col] = count++;
        }

        // 更新起始位置
        startX++;
        startY++;

        // 更新offset
        offset += 2;
    }
    // 如果n为奇数的话,需要单独给矩阵最中间的位置赋值
    if (n % 2 === 1) {
        res[mid][mid] = count;
    }
    return res;
};