给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
示例 1:
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
示例 2:
输入:target = 4, nums = [1,4,4]
输出:1
示例 3:
输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0
来源:力扣(LeetCode) 链接:leetcode.cn/problems/mi… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码:
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
left, right,size,temp = 0,0,1000000,1000000
sum_windows = 0
while right < len(nums):
sum_windows += nums[right]
while sum_windows >= target:
temp = right - left + 1
if temp < size:
size = temp
sum_windows -= nums[left]
print(left)
left += 1
right += 1
if size == 1000000:
return 0
return size
思路: 外层循环结束位置,内层循环找到所有以当前结束位置的满足大于tariget的起始位置。并记录窗口长度
- 外部循环,循环的是结束位置,也就是窗口的右边界
- sum求和不能每次都把窗口中的数字都加和,那样会超时,当找到一个符合大于target的窗口时,要开始从sum里面减去nums[left]。