数组 - 长度最小子数组 | 滑动窗口
本题以力扣上的209号题目为例。
偷个懒,问题描述就不写了,直接看截图
具体核心就是这张图,这里偷一下卡哥的图。
接下来我们就按照图示写代码
func minSubArrayLen(target int, nums []int) int {
slow, fast := 0, 0 // 窗口的起始位置和结束位置
sum := 0 // 窗口成立的条件,只有sum大于等于target才能成为一个窗口
length := math.MaxInt // 因为我们要求的是最小值,所以长度初始化位最大值
for ; fast < len(nums); fast++{
// 确定窗口是否成立
sum += nums[fast]
// 窗口成立,不断缩小窗口的起始位置,直至找到一个最小值
for sum >= target {
length = min(length, fast - slow + 1) // 因为我们会不断缩小窗口的起始位置,所以每次length都会变,在length变化的过程中,我们要找到最小的那个长度
// 如何不断缩小窗口的起始位置?
// 将此时窗口的总和减去第一个元素的值,并且起始位置不断加一
sum -= nums[slow]
slow++
}
}
if length == math.MaxInt{
return 0
}
retrun length
}
func min(a, b int) int {
if a > b {
return b
}
return a
}