[leetcode日記]209. 長度最小的子數組

題目

給定一個含有 n 個正整數的數組和一個正整數 s ,找出該數組中滿足其和 ≥ s
的長度最小的連續子數組,並返回其長度。如果不存在符合條件的連續子數組,返回 0。

示例:

輸入: s = 7, nums = [2,3,1,2,4,3] 輸出: 2 解釋: 子數組 [4,3] 是該條件下的長度最小的連續子數組。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/minimum-size-subarray-sum
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

分析

題目中要求“和”、“長度最小的連續子數組”等關鍵字眼,讓我們想到這是一道可以利用滑動窗口法解決的問題。如果我們保存一個數組sum,前i位取值爲數組的前i位之和(0<=i<=len)。那麼我們就可以在sum數組上用雙指針滑動窗口的辦法解決問題了。
1.初始兩指針start、end位置均在0處,此時有 sum[0] == 0;
2.end自增直到sum[end] - sum[start] >= s; 判斷是否更新此時的最小數組長度。
3.start自增直到sum[end] - sum[start] < s;
4.如果end == len 就結束循環,否則重新回到第2步。

對於一些邊界情況(n數組長度爲0或者所有數字加起來沒有s大等情況,可能需要單獨討論)。
然後其實還可以上面的基礎上進行空間上的優化——去掉sum數組,直接用一個int型的變量來代替。思路和上述類似,具體請看代碼。

代碼

class Solution {
    public int minSubArrayLen(int s, int[] nums) {
        int n = nums.length;
        if (n == 0) {
            return 0;
        }
        int ans = Integer.MAX_VALUE;
        int start = 0, end = 0;
        int sum = 0;
        while (end < n) {
            sum += nums[end];
            while (sum >= s) {
                ans = Math.min(ans, end - start + 1);
                sum -= nums[start];
                start++;
            }
            end++;
        }
        return ans == Integer.MAX_VALUE ? 0 : ans;
    }
}

運行結果

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章