209. 长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度。如果不存在符合条件的连续子数组,返回 0。
示例:
输入:s = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的连续子数组。
分析:
长度最小、连续、子数组,根据这些关键字,我们可以大概猜测出本题可以用 滑动窗口来解决。
滑动窗口:
滑动窗口可以说是LeetCode的一个非常重要的算法模板,这里给出基本概念的Python代码:
right, left = 0, length - 1
while right < length:
# 窗口扩大
# ...
right++
# 窗口缩小
# ...
left++
首先定义数组(或类数组,即可迭代或数字下标索引的)的双指针,作为滑动窗口的两端。
- 定义外部变量存储答案(最小值或最大值)
- 循环遍历,跳出条件为:right > length
- 不断地扩大滑动窗口,right++,直到满足题目的特定要求
- 缩小窗口,right++,直到不再满足该条件
- 更新答案
代码(Golang):
func minSubArrayLen(s int, nums []int) int {
curSum := 0
n := len(nums)
ans := n + 1
left, right := 0, 0
for right < n {
curSum += nums[right]
right++
for curSum >= s {
if right - left < ans {
ans = right - left
}
curSum -= nums[left]
left++
}
}
if ans == n + 1 {
return 0
} else {
return ans
}
}