题目
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度。如果不存在符合条件的连续子数组,返回 0。
示例:
输入: s = 7, nums = [2,3,1,2,4,3]
输出: 2
解释: 子数组 [4,3] 是该条件下的长度最小的连续子数组。
进阶:
如果你已经完成了O(n) 时间复杂度的解法, 请尝试 O(n log n) 时间复杂度的解法。
解题思路
public int minSubArrayLen(int s, int[] nums) {
//双浮动指针
int minRet = Integer.MAX_VALUE;
if (minRet <= 0){
return 0;
}
int left = 0;
int right = left;
int subSumRet = nums[left];
while (right <= nums.length-1){
// System.out.println(left + " " + right + " subSum:" + subSumRet);
//子数组少于目标数
if (subSumRet<s){
right++;
//防止数组越界
if (right >=nums.length){
return 0;
}
subSumRet += nums[right];
}else
{
int[] subArr = Arrays.copyOfRange(nums, left, right+1);
minRet = Math.min(minRet, subArr.length);
// System.out.println(Arrays.toString(subArr) + " " + minRet);
int tempSumRet = subSumRet - nums[left];
// System.out.println("tempSubRet:"+tempSumRet);
//如果减左没法维持目标数就右增,否则就左减
if (tempSumRet >=s && subArr.length>1)
{
left++;
subSumRet = tempSumRet;
}
else
{
right++;
//防止数组越界
if (right >=nums.length){
continue;
}
subSumRet += nums[right];
}
}
}
return minRet;
}