【代码随想录算法训练营】D2 977. 有序数组的平方 209.长度最小的子数组 59. 螺旋矩阵Ⅱ

今日题目:

  • 977. 有序数组的平方
  • 209.长度最小的子数组
  • 59. 螺旋矩阵Ⅱ

解题思想:

  1. 双指针

977.有序数组的平方,此题破题的关键是:因为数组可能有负数,数组平方后,最大的数一定出现在数组两端。所以可以利用双指针从两边向里面探索。

  1. 滑动窗口
  1. 长度最小的子数组用的就是滑动窗口的思想。滑动窗口的思想其实与双指针类似,但是是取两个指针中间的集合的值,所以用滑动窗口来类比更加贴切。滑动窗口的重点就是:如何控制慢指针移动。快指针不断往后遍历,计算当前区间的元素总值,当超过target的时候,此时的区间就是满足条件的答案,所以记录它,此时才应移动慢指针,判断下一个区间是否也满足条件,并且寻找下一个满足条件的区间。通过动态调整慢指针起始位置,来收集不同长度区间里的和,比较
  1. 循环不变量

坚持一个思想去处理每一条边。我们不去处理每一条边最后一个节点,把这个节点留给下次循环,作为下次循环的第一个节点进行处理,统一为左闭右开


代码:

    1. 有序数组的平方
//时间复杂度为O(n)
var sortedSquares = function(nums) {
    let L = 0
    let R = nums.length-1
    const res = [nums.length]
    for(let i = nums.length-1; i >=0 ; i--) {
        let num1 = nums[L] * nums[L]
        let num2 = nums[R] * nums[R]

        if(num1>num2) {
            res[i] = num1
            L++
        } else {
            res[i] = num2
            R--
        }
    }


    return res
};
  • 209.长度最小的子数组
//时间复杂度O(n)
var minSubArrayLen = function(target, nums) {
    let L = R = 0
    let minSize = nums.length+1
    let curSum = 0  //收集窗口里面的元素的和
    while(R<nums.length) {
        curSum += nums[R]
        //注意,这里用的是while,慢指针向后移是一个持续向后移的过程,直到滑动窗口里面的元素和小于target为止
        while(curSum >= target) {
            minSize = Math.min(minSize, R-L+1)
            curSum -= nums[L++]
        }
        R++
    }

    return minSize<=nums.length?minSize:0
}
    1. 螺旋矩阵Ⅱ
var generateMatrix = function(n) {
    const res = Array.from(Array(n), () => Array(n).fill(0))
    
    let startX = startY = 0
    let loop = Math.floor(n/2)  //圈数
    let mid = Math.floor(n/2)  //中间
    let offset = 1
    let count = 1

    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 += 2
    }

    if(n%2 ===1 ) {
        res[mid][mid] = count
    }

    return res
};

总结:

因为一些突发状况先挖坑…过几天再填…
10.16已填坑,编译原理终于考完了,可以安心刷题了

数组篇完结,二分法掌握得还算不错,但是螺旋矩阵需要注意的点还蛮多的,并且不是很熟悉,需要多练几遍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值