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

977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II ,总结

建议大家先独立做题,然后看视频讲解,然后看文章讲解,然后在重新做一遍题,把题目AC,最后整理成今日当天的博客

拓展题目可以先不做

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

  • 数组形式:非递减(有序可重复)
  • 要求:时间复杂度O(n)
  • 两种方法:暴力解法+双指针
  1. 暴力解法:需要结合排序算法,不满足时间复杂度要求
  2. 双指针:其实有三个指针,两个指向原始数组的首尾,一个指向新数组的“最后”(即插入“最大值”的位置)
class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        left, right, insert = 0, len(nums)-1, len(nums)-1 # 三个指针
        res = [float('inf')] * len(nums)
        while left <= right:
            if nums[left] ** 2 < nums[right] **2:
                res[insert] = nums[right] ** 2
                right -= 1
            else:
                res[insert] = nums[left] ** 2
                left += 1
            insert -= 1
        return res

注意其中python代码的写作:

  1. 列表初始化:[float(‘inf’)] * len(nums) 这里取什么值没关系,主要还是为了防止越界访问吧
  2. 平方的计算

双指针什么时候使用

  • 一般要求O(n)或者原地修改可以考虑双指针

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

  • 数组形式:不重要
  • 思路关键:连续子数组
  • 关键要求:如果你已经实现 O(n) 时间复杂度的解法, 请尝试设计一个 O(n log(n)) 时间复杂度的解法
  • 解法:滑动窗口(也是双指针)
class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        size = len(nums)
        left, right = 0, 0
        min_len = float('inf')
        cum_sum = 0

        while right < size:
            cum_sum += nums[right]

            while cum_sum >= target:
                min_len = min(min_len, right-left + 1)
                cum_sum -= nums[left]
                left += 1
            
            right += 1

        return min_len if min_len != float('inf') else 0

59.螺旋矩阵II

题目建议: 本题关键还是在转圈的逻辑,在二分搜索中提到的区间定义,在这里又用上了。

题目链接: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/

螺旋矩阵思路

  • 由一个整数生成数组
  • 关键点:厘清每次不变的量,定义好边界点
class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        loop, mid = n//2, n//2
        start_x, start_y = 0,0

        count = 1
        res = [[0]*n for _ in range(n)]

        for offset in range(1, loop+1):
            
            for i in range(start_y, n-offset): #从左至右
                res[start_x][i] = count
                count += 1
            
            for i in range(start_x, n-offset): #从上至下
                res[i][n-offset] = count
                count += 1
            
            for i in range(n-offset,start_y,-1): #从右至左
                res[n-offset][i] = count
                count += 1
            
            for i in range(n-offset,start_x,-1): #从上至下
                res[i][start_y] =  count
                count += 1
            
            start_x += 1
            start_y += 1

        if n%2 != 0:
            res[mid][mid] = n**2
        
        return res

python代码书写注意:

  • 初始化二维列表的方式 https://blog.csdn.net/qdPython/article/details/127771793

总结

题目建议:希望大家 也做一个自己 对数组专题的总结

文章链接:https://programmercarl.com/%E6%95%B0%E7%BB%84%E6%80%BB%E7%BB%93%E7%AF%87.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值