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


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