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 长度最小的子数组
最新推荐文章于 2023-05-24 15:13:43 发布