public static int minSubArrayLen(int target, int[] nums) {
int n=nums.length;
int[] pre=new int[n+1];//前缀和
for (int i = 1; i <= n; i++) {
pre[i]=nums[i-1]+pre[i-1];
}
int min=Integer.MAX_VALUE;//记录最小长度
//枚举pre
for (int i = 0; i < n; i++) {
if(pre[i]+target>pre[n])//大于总和就结束
break;
int idx=Arrays.binarySearch(pre,pre[i]+target);//二分查找大于等于pre[i]+target的最小前缀和
if(idx<0)
idx=-idx-1;//找不到,返回值的倒数为该值应在pre中的位置(从1开始),该位置的数即为目标值
min=Math.min(min,idx-i);//数组长度为i+1到idx
}
return min==Integer.MAX_VALUE?0:min;
}
前缀和+二分算法leetcode.209
于 2022-03-08 21:16:59 首次发布