Skip to content

Latest commit

 

History

History
76 lines (67 loc) · 2.01 KB

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

File metadata and controls

76 lines (67 loc) · 2.01 KB

题目描述

209. 长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 target

找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度**。**如果不存在符合条件的子数组,返回 0

示例 1:

输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。

示例 2:

输入:target = 4, nums = [1,4,4]
输出:1

示例 3:

输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0

提示:

  • 1 <= target <= 109
  • 1 <= nums.length <= 105
  • 1 <= nums[i] <= 105

解题步骤

这道题关键词连续子数组求目标和, 我们应该潜意识想到用滑动窗口,根据窗口的和结果的不同扩大、缩小窗口

  1. 当前窗口和 >= target符合条件, 更新minLen最小长度, 低位向右收缩窗口, 直到当前窗口不符合条件
  2. 当前窗口和< target 需要继续加入新的值来增大和,高位向右扩展窗口

代码如下

func minSubArrayLen(target int, nums []int) int {
    minLen := math.MaxInt64
    curSum := 0
    low := 0 //窗口低位索引   high窗口高位索引
    for high:=0; high < len(nums); high++ {
        curSum += nums[high]
      for curSum >= target { //当前窗口和大于等于target时  低位慢慢收缩  获取到符合条件的最小窗口(长度)
            minLen = min(minLen, high-low+1)
            curSum -= nums[low]
            low++ 
        }
    }
    if minLen == math.MaxInt64 {
        return 0
    }
    return  minLen
}
func min(a, b int) int {
    if a < b {
        return a
    }
    return b
}

时间复杂度:O(n)

空间复杂度:O(1)