数组理论基础及例题(二)

本文介绍了力扣209题“长度最小的子数组”的滑动窗口解法,从暴力解法优化到滑动窗口,详细阐述了滑动窗口算法的时间复杂度和空间复杂度。接着讨论了59题“螺旋矩阵 II”的模拟过程,强调了循环不变量原则和边界条件处理,分析了时间复杂度和空间复杂度。
摘要由CSDN通过智能技术生成

长度最小的子数组

力扣209

首先尝试:暴力解法,两个for循环,一个控制区间左端点,一个控制区间右端点,不断寻找符合条件的子序列,找到一个就更新res和左端点:

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        res = float('inf') #定义无限大的数
        n = len(nums)
        for i in range(n):
            sum = 0
            for j in range(i, n): #从i开始向后计算
                sum += nums[j]
                if sum >= target: #找到符合目标的序列,更新res
                    res = min(res, j - i + 1)
                    break #要找最短的,符合条件后面的就不用看了
        return 0 if res == float('inf') else res

时间复杂度:O(n^2);空间复杂度:O(1)。力扣不能通过,显示超时。

优化方法:滑动窗口(类似双指针)。

所谓滑动窗口,就是不断调节子序列的起始位置和终止位置,从而得出我们想要的结果。在暴力解法中,是一个for循环调节滑动窗口的起始位置,一个for循环调节滑动窗口的终止位置,用两个for循环完成了一个不断搜索区间的过程。而滑动窗口是用一个for循环来完成这个操作。重点:

  • 窗口内满足的条件?1其和 ≥ target;2长度最小;3连续。
  • 这个for循环控制的是起始位置还是终止位置?假设是起始位置,那么终止位置的操作与暴力解法无异,所以应该是终止位置。
  • 起始位置如何移动?如果当前窗口的值大于target了,起始位置向后移动,找到满足条件的长度最小的窗口,更新res。
  • while sum >= target:     用while而不是if,因为可能最后一个数值比较大,起始位置不止移动一次。
<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值