描述
给定一个由 n 个正整数组成的数组和一个正整数 s ,请找出该数组中满足其和 ≥ s 的最小长度子数组。如果无解,则返回 -1。
样例:
输入: [2,3,1,2,4,3], s = 7
输出: 2
解释: 子数组 [4,3] 是该条件下的最小长度子数组。
样例 2:
输入: [1, 2, 3, 4, 5], s = 100
输出: -1
挑战
如果你已经完成了O(nlogn)时间复杂度的编程,请再试试 O(n)时间复杂度。
- 解法:
- 同向双指针
- 每次删除左指针左边的数字
- 只要当前和小于s,右指针继续向右移动
- 时间复杂度O(n)
public class Solution {
/**
* @param nums: an array of integers
* @param s: An integer
* @return: an integer representing the minimum size of subarray
*/
public int minimumSize(int[] nums, int s) {
if( nums == null || nums.length == 0 || s==0)
return -1;
int tsum = 0;
int minCount = Integer.MAX_VALUE;
int count = 0;
int i;int j = 0;
boolean flag = false;
for(i = 0 ; i < nums.length ; i ++){
// System.out.println(tsum);
if(i>0){
tsum -= nums[i-1];
count--;
}
for( ; j < nums.length ; j++){
//建议这里用while循环
//如果tsum<s即flag==false就空转一下,也就是不加nums[j],因为nums[j]已经在上一轮加过了
if(flag==false){
tsum += nums[j];
count++;
}
if(tsum>=s){
minCount = count < minCount ? count : minCount;
flag = true;
break;
}else{
flag = false;
}
// System.out.println(count);
// j = 4 , i = 1 , tsum = 11 ,count = 4
// j = 4 , i = 2 , tsum = 8 , count = 3 tsum < s
//
}
}
return minCount = minCount==Integer.MAX_VALUE?-1:minCount;
}
}