package KTwoPointers;
/**
* @Author Zhou jian
* @Date 2020 ${month} 2020/5/11 0011 12:26
* 長度最小的子數組
* 給定一個含有 n 個正整數的數組和一個正整數 s ,
* 找出該數組中滿足其和 ≥ s 的長度最小的連續子數組,
* 並返回其長度。如果不存在符合條件的連續子數組,返回 0。
*
* 和大於k的最小長度的子數組的
*/
public class Problem209 {
//當left固定時,不停向右移動right,直到子數組[left,....right]滿足提議
//此時以nums[left]開頭的滿足提議的子數組就不會更短了直接left+=1
//尋找以另一個元素開頭的子數組的可能性
//此時rigjt 依舊不變,因爲right指向的元素可能很大
public int minSubArrayLen(int s, int[] nums) {
if(nums==null||nums.length==0) return 0;
if(nums[0]>s) return 1;
int left = 0;//左指針
int right = 0;//有指針
int length = nums.length;
int curlength = Integer.MAX_VALUE;
int curSum = nums[0];//累加器,窗口中元素的和
//
while(right<length-1){
//右指針向前移動一步
right++;//固定右指針.擴大窗口
//窗口中的元素小於目標值,右指針向右移動,擴大窗口
curSum=curSum+nums[right];
//當窗口的左邊小於右邊 並且當前計算值大於s,鎖小窗口
//窗口中的元素大於目標值,左指針向右移動,縮小窗口
while (left<=right&&curSum>=s){
// 窗口中的元素大於目標值,此時的窗口長度爲 ans
curlength=Math.min(curlength,right-left+1);
// 在左指針向右移1位之前, 先把 left 位置此時的值,從 sum 中減去
curSum=curSum-nums[left];
left++;
}
}
return curlength==Integer.MAX_VALUE?0:curlength;
}
public static void main(String[] args) {
int[] arr = {2,3,1,2,4,3};
Problem209 problem209 = new Problem209();
int min = problem209.minSubArrayLen(7,arr);
System.out.println(min);
}
}
LeetCode209 長度最小的子數組
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.