LeetCode209 長度最小的子數組

長度最小的子數組>>>
在這裏插入圖片描述


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);
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章