leetcode 209. 【长度最小的子数组】
这是一道典型的区间类问题,解决区间类的问题首先要想到使用滑动窗口来解决。滑动窗口是有一套模板的,并且这套模板是不需要背的,只需要自己给自己回答几个问题即可。
- 窗口滑动到什么情况下终止滑动?
- 窗口什么时候滑动?
- 窗口如何滑动?
- 滑动的目的是什么?
滑动窗口核心思想
- 初始化双指针left和right。
- 先不断增加right扩大窗口,直到窗口中的内容符合要求。
- 停止增加right,不断增加left缩小窗口,直到窗口中的内容不再满足要求。在每次增加left时都要更新所求的结果。
- 不断重复扩大窗口、缩小窗口的操作,直到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
通过回答问题的方式我们就把这题给解决了。
总结
首先是识别题型,有些题是区间类的算法题但是并不太容易识别,这就需要有一定的做题经验了。其次是找到解决这类问题的办法,总结出这个办法的代码书写模板(框架),总结模板的本质是回答问题的过程,进一步理解就是要梳理你出为什么要这么做?导向是不断的接近你的目的!!!
区间类问题的特点:最长子字符串;子数组