题目描述
Given an array of n positive integers and a positive integer s, find the minimal length of a contiguous subarray of which the sum ≥ s. If there isn’t one, return 0 instead. For example, given the array [2,3,1,2,4,3] and s = 7, the subarray [4,3] has the minimal length under the problem constraint. 地址
问题分析
一个数组全为正数,那么寻找子数组之和 >= s 的最长子数组,返回其长度,若没找到,返回0 用双指针 left 与 right 来指示 窗口 [left, right],根据窗口内所有元素之和 winSum 来决定如何移动窗口。
若 winSum < s ,那么窗口加数,right++ 若winSum >= s ,那么先根据当前窗口大小来更新 minLength, 然后左侧窗口出数,left– 根据不同的窗口计算方法,又可以分为两种解法
预处理数组,形成sum[]数组,sum[i] 表示 nums[0] ~ nums[i] 的加和。那么窗口 [left, right] 的winSum 便是 sum[right] - sum[left - 1] 更改窗口时便更新 winSum
经验教训
代码实现
public int minSubArrayLen(int s, int [] nums) {
if (nums == null || nums.length == 0 ) {
return 0 ;
}
int left = 0 ;
int right = 0 ;
int winSum = 0 ;
int minLength = nums.length + 1 ;
while (right < nums.length ) {
winSum += nums[right];
while (winSum >= s) {
minLength = Math.min (minLength, right - left + 1 );
winSum -= nums[left++];
}
++right;
}
return minLength == nums.length + 1 ? 0 : minLength;
}
public int minSubArrayLen(int s, int [] nums) {
if (nums == null || nums.length == 0 ) {
return 0 ;
}
int left = 0 ;
int right = 0 ;
int minLength = nums.length + 1 ;
int winSum = 0 ;
int [] sum = new int [nums.length];
sum [0 ] = nums[0 ];
for (int i = 1 ; i < sum .length; i++) {
sum [i] = nums[i] + sum [i - 1 ];
}
while (left < nums.length && right < nums.length) {
winSum = left == 0 ? sum [right] : sum [right] - sum [left - 1 ];
if (winSum < s) {
right++;
}else {
minLength = Math.min(minLength, right - left + 1 );
left++;
}
}
return minLength == nums.length + 1 ? 0 : minLength;
}
public int minSubArrayLen(int s, int [] nums) {
if (nums == null || nums.length == 0 || s <= 0 ) {
return 0 ;
}
int left = 0 ;
int right = -1 ;
int minLength = nums.length + 1 ;
int winSum = 0 ;
while (left < nums.length && right < nums.length ) {
if (winSum < s) {
++right;
winSum += (right < nums.length ) ? nums[right] : 0 ;
}
if (winSum >= s) {
minLength = Math.min (minLength, right - left + 1 );
winSum -= nums[left++];
}
}
return minLength == nums.length + 1 ? 0 : minLength;
}