区间类的算法问题使用滑动窗口解决

leetcode 209. 【长度最小的子数组】
这是一道典型的区间类问题,解决区间类的问题首先要想到使用滑动窗口来解决。滑动窗口是有一套模板的,并且这套模板是不需要背的,只需要自己给自己回答几个问题即可。

  1. 窗口滑动到什么情况下终止滑动?
  2. 窗口什么时候滑动?
  3. 窗口如何滑动?
  4. 滑动的目的是什么?

滑动窗口核心思想

  1. 初始化双指针left和right。
  2. 先不断增加right扩大窗口,直到窗口中的内容符合要求。
  3. 停止增加right,不断增加left缩小窗口,直到窗口中的内容不再满足要求。在每次增加left时都要更新所求的结果。
  4. 不断重复扩大窗口、缩小窗口的操作,直到right到达序列的末端。
class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
			# 区间内问题先求出数组长度
        nums_len = len(nums)
        # 因为是求最小的子数组所以结果值取大于长度的值
        res = nums_len * 2
        # 滑动窗口初始化
        left, right = 0, 0
        # 滑动的目的是什么? 找出最短区间,且区间内的值求和后大于等于目标值。
        # 所以初始化一个值和目标值作比较
        cnt = 0
        # 窗口滑动到什么情况下终止滑动? 右指针滑到头
        while right < nums_len:

            # cnt什么情况下加? cnt 小于target的时候
            cnt += nums[right]
            
			# 窗口如何滑动?
            # 什么情况左指针移动? 当cnt大于目标值的时候
            # 什么时候左指针停止移动,右指针移动?当cnt小于目标值的时候
            # 什么时候计算数组长度的最小值? 当cnt大于目标值的时候
            while cnt >= target:
                res = min(res, right - left + 1)
                cnt -= nums[left]
                left += 1
					 # 窗口什么时候滑动? 
            right += 1
        return 0 if res == nums_len * 2 else res

通过回答问题的方式我们就把这题给解决了。

总结

首先是识别题型,有些题是区间类的算法题但是并不太容易识别,这就需要有一定的做题经验了。其次是找到解决这类问题的办法,总结出这个办法的代码书写模板(框架),总结模板的本质是回答问题的过程,进一步理解就是要梳理你出为什么要这么做?导向是不断的接近你的目的!!!

区间类问题的特点:最长子字符串;子数组

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值