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

今日学习:

977.有序数组的平方

题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/

文章讲解:https://programmercarl.com/0977.%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E7%9A%84%E5%B9%B3%E6%96%B9.html

视频讲解: https://www.bilibili.com/video/BV1QB4y1D7ep

第一想法

显然是先想着先将各元素平方push至新数组,然后进行快速排序;后来结合双指针思路,我意识到可以从两边寻找最大的数,对新数组进行填充

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var sortedSquares = function (nums) {
    let left = 0
    let right = nums.length - 1
    let newnums = []  //改为 let newnums = new Array(n).fill(0); 更规范
    let k = right
    while (left <= right) {
        if (nums[left] * nums[left] < nums[right] * nums[right]) {
            newnums[k] = nums[right] * nums[right]
            right--
        } else {
            newnums[k] = nums[left] * nums[left]
            left++
        }
        k--
    }
    return newnums
};

209.长度最小的子数组

题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/

文章讲解:https://programmercarl.com/0209.%E9%95%BF%E5%BA%A6%E6%9C%80%E5%B0%8F%E7%9A%84%E5%AD%90%E6%95%B0%E7%BB%84.html

视频讲解:https://www.bilibili.com/video/BV1tZ4y1q7XE

第一想法

改题目最关键的一点就是要先调整滑动窗口的重点,再一点点减起点
第一次做的时候未考虑到将返回的长度定义为无穷大,导致消耗了点时间

/**
 * @param {number} target
 * @param {number[]} nums
 * @return {number}
 */
var minSubArrayLen = function (target, nums) {
    let sum = 0
    let i = 0
    let length = Infinity
    for (let j = 0; j <= nums.length - 1; j++) {
        sum += nums[j]
        while (sum >= target) {
            length = Math.min(length, j - i + 1)
            sum -= nums[i++]
        }
    }
    return length === Infinity ? 0 : length
};
209.长度最小的子数组.gif

59.螺旋矩阵

题目链接:https://leetcode.cn/problems/spiral-matrix-ii/

文章讲解:https://programmercarl.com/0059.%E8%9E%BA%E6%97%8B%E7%9F%A9%E9%98%B5II.html

视频讲解:https://www.bilibili.com/video/BV1SL4y1N7mV/

第一想法

这道题其实每次做一开始都会想很多,但其实只要边画图边敲代码,就可以很快做出来,还是要多回顾这个螺旋矩阵

/**
 * @param {number} n
 * @return {number[][]}
 */
var generateMatrix = function (n) {
    let sx = 0
    let sy = 0
    let os = 1
    let count = 1
    let nums = new Array(n).fill(0).map(() => new Array(n).fill(0));
    let loop = Math.floor(n / 2)

    while (loop--) {
        let j = sy, i = sx
        for (; j < n - os; j++) {
            nums[sx][j] = count++
        }
        for (; i < n - os; i++) {
            nums[i][j] = count++
        }
        for (; j > sy; j--) {
            nums[i][j] = count++
        }
        for (; i > sx; i--) {
            nums[i][j] = count++
        }
        sx++
        sy++
        os++
    }
    let mid = Math.floor(n / 2)
    if (n % 2 == 1) {
        nums[mid][mid] = n * n
    }
    return nums
};
image.png

数组总结

image.png

温故而知新,我能熟练掌握二分法,双指针法,滑动窗口,循环矩阵等知识,多回顾才能扎实!


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容