題目
給定一個含有 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;
}
}