数组 - 长度最小子数组 | 滑动窗口

41 阅读1分钟

数组 - 长度最小子数组 | 滑动窗口

本题以力扣上的209号题目为例。

image.png 偷个懒,问题描述就不写了,直接看截图

209.长度最小的子数组.gif

具体核心就是这张图,这里偷一下卡哥的图。

接下来我们就按照图示写代码

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
}