題目
給定一個含有 n 個正整數的數組和一個正整數 s ,找出該數組中滿足其和 ≥ s 的長度最小的連續子數組,并傳回其長度。如果不存在符合條件的連續子數組,傳回 0。
示例:
輸入: s = 7, nums = [2,3,1,2,4,3]
輸出: 2
解釋: 子數組 [4,3] 是該條件下的長度最小的連續子數組。
進階:
如果你已經完成了O(n) 時間複雜度的解法, 請嘗試 O(n log n) 時間複雜度的解法。
解題思路
public int minSubArrayLen(int s, int[] nums) {
//雙浮動指針
int minRet = Integer.MAX_VALUE;
if (minRet <= 0){
return 0;
}
int left = 0;
int right = left;
int subSumRet = nums[left];
while (right <= nums.length-1){
// System.out.println(left + " " + right + " subSum:" + subSumRet);
//子數組少于目标數
if (subSumRet<s){
right++;
//防止數組越界
if (right >=nums.length){
return 0;
}
subSumRet += nums[right];
}else
{
int[] subArr = Arrays.copyOfRange(nums, left, right+1);
minRet = Math.min(minRet, subArr.length);
// System.out.println(Arrays.toString(subArr) + " " + minRet);
int tempSumRet = subSumRet - nums[left];
// System.out.println("tempSubRet:"+tempSumRet);
//如果減左沒法維持目标數就右增,否則就左減
if (tempSumRet >=s && subArr.length>1)
{
left++;
subSumRet = tempSumRet;
}
else
{
right++;
//防止數組越界
if (right >=nums.length){
continue;
}
subSumRet += nums[right];
}
}
}
return minRet;
}