题目中提到“连续子数组”,首先考虑用双指针技巧解题。双指针大约有如下几种具体形式
- 两个“指针”从序列左端向右端移动
- 两个“指针”从序列右端向左端移动。少见
- 两个“指针”分别从序列左端和右端向中间移动
- 两个“指针”从序列中间分别向两端移动。少见
分析题目给的条件,数组元素都是正整数,找到和大于或等于target的长度最小的连续子数组。这里我们可以使用滑动串口技巧(上面第1条的一种特殊形式)。
具体代码如下(已提交通过)
import "math"
func minSubArrayLen(target int, nums []int) int {
var (
i int
j int
sum int
// 设置一个极大值,简化for循环里第一次更新minLen。
minLen = math.MaxInt32
l = len(nums)
)
for j < l {
// 增大窗口
sum += nums[j]
j++
// 如果和达到了target,就不断循环,直到不满足条件为止。
for sum >= target {
// 更新满足条件的连续子数组的最小长度
if j-i < minLen {
minLen = j-i
}
// 缩小窗口
sum -= nums[i]
i++
}
// 此处的边界情况 i == j
}
if minLen == math.MaxInt32 {
return 0
}
return minLen
}