和大于S的最小子数组
题目
给定一个由 n 个整数组成的数组和一个正整数 s ,请找出该数组中满足其和 ≥ s 的最小长度子数组。如果无解,则返回 -1。
样例
给定数组 [2,3,1,2,4,3] 和 s = 7, 子数组 [4,3] 是该条件下的最小长度子数组。
挑战
如果你已经完成了O(n)时间复杂度的编程,请再试试 O(n log n)时间复杂度。
题解
前后双指针遍历,如果子数组[i,j]的和大于s,则记录子数组长度并将i后移。如果子数组[i,j]的和小于s,则将j后移。
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) {
int i = 0;
int j = 0;
int sum =0;
int ans = Integer.MAX_VALUE;
for(i = 0; i < nums.length; i++)
{
while(j < nums.length && sum < s)
{
sum += nums[j];
j++;
}
if(sum >= s)
{
ans = Math.min(ans, j - i);
}
sum -= nums[i];
}
return ans == Integer.MAX_VALUE ? -1 : ans;
}
}
Last Update 2016.11.13