“`
返回 A 的最短的非空连续子数组的长度,该子数组的和至少为 K 。
如果没有和至少为 K 的非空子数组,返回 -1 。
示例 1:
输入:A = [1], K = 1
输出:1
示例 2:
输入:A = [1,2], K = 4
输出:-1
示例 3:
输入:A = [2,-1,2], K = 3
输出:3
“`
“`
重点就是每次遍历的时候,加到i的时候,把i之前的负数全部转换。为什么要这么做,这么做代表i之前的sum在每个位置都是单调上升的,所以在求i位置最短长度的时候,就可以依次减去begin开始的位置,最后一个大于K的时候,就是i位置的最短子数组
“`
“`
public static int test4(int[]A,int K){
int length = A.length;
int sum = 0;
int len=-1;
int begin =0;
for (int i=0;i
if (A[i]>=K){
return 1;
}
sum=sum+A[i];
if (sum<=0){
begin=i+1;
sum=0;
continue;
}
/**
*这是加到i的时候,把i之前的负数,全部化解掉,化解到之前的
*/
for (int j=i-1;A[j+1]<0;j–){
A[j]=A[j]+A[j+1];
A[j+1]=0;
}
if (sum>=K){
if (i-begin+1
len = i-begin+1;
}
int tmpBegin = begin;
while (sum-A[tmpBegin]>=K){
sum=sum-A[tmpBegin];
begin=tmpBegin+1;
tmpBegin++;
if (i-begin+1
len=i-begin+1;
}
}
}
}
return len;
}
“`