Leetcode ---- 209. 長度最小的子陣列
阿新 • • 發佈:2018-11-29
題目:
給定一個含有 n 個正整數的陣列和一個正整數 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; } };