[LeetCode]209. 長度最小的子數組

題目

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

示例:

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

進階:

  • 如果你已經完成了 O(n) 時間複雜度的解法, 請嘗試 O(n log n) 時間複雜度的解法。

解題思路

定義兩個指針 i 和 j 分別表示子數組的開始位置和結束位置,維護變量 sum 存儲子數組中的元素和(即從nums[i] 到 nums[j] 的元素和)。初始狀態下,i 和 j 都指向下標 0,sum 的值爲 0。每一輪迭代,將nums[j] 加到 sum,如果 sum ≥ s,則更新子數組的最小長度(此時子數組的長度是 j−i+1),然後將 nums[i] 從 sum 中減去並將 i 右移,直到 sum < s,在此過程中同樣更新子數組的最小長度。在每一輪迭代的最後,將 j 右移。

複雜度分析:
時間複雜度:O(n),其中 n 是數組的長度。指針 i 和 j 最多各移動 n 次。
空間複雜度:O(1)。

代碼

class Solution {
    public int minSubArrayLen(int s, int[] nums) {
        int n = nums.length;
        if(n==0) return 0;
        int i = 0;
        int j = 0;
        int sum = 0;
        int minLen = n+1;
        while(j<n){
            sum += nums[j]; // 如果此處寫 j++,那麼下面計算長度就是 j-i,最下面的 j++ 就不用寫了。
            while(sum>=s){
                minLen = Math.min(minLen, j-i+1);
                sum -= nums[i++];
            }
            j++;
        }
        return minLen == n+1 ? 0 : minLen;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章