//O(n)的方法,其实有两种方法。一个是用两个指针从左往右扫描,left和right记录满足要求的连续子数组左边界和右边界,先移动right直到期间的和大于等于k,然后再把left往右移动来缩小子数组的长度,并且更新最短子数组长度。
//第二种借用HashMap,存储累加值和索引的对应关系。先将数组从左往右累加,然后再类似于“连续子数组之和大于k的最大长度”来实现
public int minSubArrMoreK(int[] nums,int k){
if(nums==null || nums.length==0) return 0;
int left=0,right=0,sum=0;
int res = nums.length+1; ;
while(right < nums.length){
while(sum < k && right < nums.length) sum += nums[right++];
while(sum >= k){
res = Math.min(res,right-left);
sum -= nums[left++];
}
}
return res==nums.length+1?0:res;
}