一、长度最小的子数组

二、解题思路
采用滑动窗口的思路,详细见代码。
三、代码
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int n = nums.length, left = 0, right = 0, sum = 0;
int ans = n + 1;
for (right = 0; right < n; right ++) { //right 遍历数组
sum += nums[right];
while (sum - nums[left] >= target) { // 当子数组的和大于等于 target 时,开始从左收缩数组
sum -= nums[left];
left++;
}
if (sum >= target) { // 当 ringht 处于数组前边部分时,可能子数组和还没有达到 target值,达到后再更新ans
ans = Math.min(ans, right - left + 1);
}
}
return ans <= n ? ans : 0;
}
}
更加简洁的一种写法
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int n = nums.length;
int sum = 0, ans = n + 1;
for (int l = 0, r = 0; r < n; r++) {
sum += nums[r];
while (l <= r && sum >= target) {
ans = Math.min(ans, r - l + 1);
sum -= nums[l++];
}
}
return ans > n ? 0 : ans;
}
}
339

被折叠的 条评论
为什么被折叠?



