力扣刷题——长度最小的子数组
双层暴力for循环已经超出了时间限制
class Solution:def minSubArrayLen(self, target: int, nums: List[int]) -> int:l=len(nums)min_len=float('inf')for i in range(l):cur_sum=0for j in range(i,l):cur_sum+=nums[j]#双层暴力for循环,第二个for循环内,当签名集合之和与当前元素相加大于或等于s,则黄if cur_sum>=target:min_len=min(min_len,j-i+1)#代表已经找到集合breakreturn min_len if min_len!=float('inf') else 0
滑动窗口
窗口就是 满足其和 ≥ s 的长度最小的 连续 子数组。
窗口的起始位置如何移动:如果当前窗口的值大于等于s了,窗口就要向前移动了(也就是该缩小了)。
窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。
class Solution:def minSubArrayLen(self, target: int, nums: List[int]) -> int:length=len(nums)l=0#左指针r=0#右指针min_len=float('inf')cur_sum=0while r<length:#当右指针小于长度时,继续往右滑cur_sum+=nums[r]while cur_sum>=target:#当累加值大于目标值时,取最小的长度min_len=min(min_len,r-l+1)#为下一次遍历做准备,如果大于S,那么左边减去一个元素,再看是否大于Scur_sum-=nums[l]#左指针右滑一位l+=1#当集合不大于S,小于了S,那么右指针往右滑动一位r+=1return min_len if min_len!=float('inf') else 0