题目:
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
示例:
输入:s = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
进阶:
如果你已经完成了 O(n) 时间复杂度的解法, 请尝试 O(n log n) 时间复杂度的解法。
分析:
- 一开始我想用暴力解法,结果超时了(不得不说,很多题都是用暴力解法解答的),所以用了双指针
- 定义两个变量,start和end来表示子数组的开始位置和结束位置
- 在一开始的时候,start和end都为0,且它们之间的元素和也为0
- 在每一轮的迭代中,如果说t>=s,就更新最小子数组的长度
- 在每一轮迭代结束后,end右移
代码:
class Solution:
def minSubArrayLen(self, s: int, nums: List[int]) -> int:
if not nums:return 0
if s in nums:return 1
res = len(nums) + 1
start,end = 0,0
t = 0
while end < len(nums):
t += nums[end]
while t >= s:
res = min(res,end-start+1)
t -= nums[start]
start += 1
end += 1
return 0 if res == len(nums) + 1 else res
结果: