題目:
給定一個含有 n 個正整數的數組和一個正整數 s ,找出該數組中滿足其和 ≥ s 的長度最小的連續子數組,並返回其長度。如果不存在符合條件的連續子數組,返回 0。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/minimum-size-subarray-sum
思路:
定義兩個下標 i 與 j ,分別代表子數組的首尾。則 子數組的長度爲 j - i +1 ,定義 sum 爲子數組的和 ,minLen 爲數組的長度 ,目標和爲 target
則從 i = 0 與 j = 0 開始 ,
1)不斷將 j ++ ,並更新sum 的和,直到sum >= target ,此時記錄當前的數組長度
2)將i++ ,重複1)的操作
Java代碼如下:
public int minSubArrayLen(int s, int[] nums) {
int i=0,j=-1;
int minLen = Integer.MAX_VALUE;
int sum = 0;
for(int a:nums){
sum+=a;
}
if(sum<s){ //當數組中所有元素和都小於 target 時,則返回 0
return 0;
}
sum = 0;
while (j<nums.length || sum>s){ //當sum大於0的時候,可以繼續將 i++ ,
if(sum>=s){
if(minLen>(j-i+1)) { //當新的滿足和要求的子數組長度更小時,則更新最小長度值
minLen = j - i + 1;
}
sum-=nums[i]; // i 向右移動一位,並更新子數組的值
i++;
}else {
j++;
if(j<nums.length)
sum+=nums[j]; // j 向右移動一位,並更新子數組的值
}
}
return minLen;
}