leetcode 209. 长度最小的子数组

185 阅读1分钟

题目链接

题目中提到“连续子数组”,首先考虑用双指针技巧解题。双指针大约有如下几种具体形式

  1. 两个“指针”从序列左端向右端移动
  2. 两个“指针”从序列右端向左端移动。少见
  3. 两个“指针”分别从序列左端和右端向中间移动
  4. 两个“指针”从序列中间分别向两端移动。少见

分析题目给的条件,数组元素都是正整数,找到和大于或等于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
}