209. Minimum Size Subarray Sum


Posted by david-christian on 2025-03-20

func minSubArrayLen(target int, nums []int) int {
    sum := 0
    result := len(nums) + 1
    i := 0

    for j := 0; j < len(nums); j++ {
        sum += nums[j]
        for sum >= target {
            subLen := j - i + 1
            if subLen < result {
                result = subLen
            }
            sum -= nums[i]
            i++
        }
    }

    if result == len(nums) + 1 {
        return 0
    } else {
        return result
    }

}

长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。

邊界條件

  • 一個元素也算子數組

滑動視窗的思路,j 表示視窗的結束位置,起始值為 0,i 表示起始位置,起始值為 0

result 紀錄目前出現過的最小子數組長度,起始值為 nums 長度 + 1,這個數值為最大,子數組長度不會大於 nums 長度

sum 紀錄目前視窗裡值的總和

每一輪迭代時,視窗擴大(終止位置右移),sum 增加 nums[j],一但 sum 符合 >= target

進行一個迭代,迭代目的是為了視窗縮小(起始位置右移),試著在符合 >= target 的條件下縮小視窗

迭代中計算視窗長度 subLen ,與 result 比較及紀錄,並右移起始位置i 和減去不在視窗內的值

直到 sum 不符合條件,回到外圍迭代,繼續移動結束位置,直到 sum 又符合條件

時間複雜度:

每個元素進入滑動視窗的時候操作一次,離開滑動視窗的時候操作一次,總共兩次

所以時間複雜度 n x 2,也就是 O(n)

重點整理:

因為子數組必須是連續的,一但 sum 符合條件,就試著縮小視窗的起始位置,找最小的長度










Related Posts

前端 Ajax Json 資料 至後端中文亂碼 (Tomcat)

前端 Ajax Json 資料 至後端中文亂碼 (Tomcat)

Day2 矩陣的用法

Day2 矩陣的用法

Install Jenkins Server On Linux (Ubuntu 22.04)

Install Jenkins Server On Linux (Ubuntu 22.04)


Comments