1. 程式人生 > >Leetcode ---- 209. 長度最小的子陣列

Leetcode ---- 209. 長度最小的子陣列

題目:

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

示例: 

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

進階:

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

 

思路:

檢視題目,我們可以發現,最短的子陣列有兩個可能性:

1.  在最大數附近;

2.  在較大數附近;

也考慮到兩種限制:

1.  最大值直接大於給定數值;

2.  所有數值相加小於給定數值;

針對以上,我們可以聯想使用滑動視窗,即左右相同起點,右指標往右移直至累加值sum > s,再逐次將左指標右移,sum值遞減,直到sum < s,再次移動右指標如此反覆。期間,每當到達臨界值的時候,記錄最小長度。

 

程式:

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        if (nums.empty())
            return 0;
        // 滑動視窗
        int left = 0;
        int right = -1;
        int sum = 0;
        int minlen = INT_MAX;
        int len = nums.size();
        while (right < len){
            while (sum < s && right < len){
                sum += nums[++right];
            }
            if (sum >= s){              
                if ((right - left + 1) <= minlen)
                    minlen = right - left + 1;
                sum -= nums[left++];
            }
        }
        return minlen < len ? minlen : 0;
    }
};