问题描述
给定一个含有 n
个正整数的数组和一个正整数 target
。找出该数组中满足其总和大于等于 target
的长度最小的 连续子数组[numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回 0
。
思路解析
主要问题就一个,怎么实现对数组中连着的几个元素进行计算?
和昨天的思路相同,双指针可以完成这个目标。使用双指针的特点是:一个指针遍历,另一个只在满足条件时发生变化。
对于本问题来说,双指针控制的区间内,就是计算的连续元素的区间。我们可以设想这样的场景:
- 右指针向前遍历,不断往双指针区间内增加元素;
- 左指针在达到某种条件时,也会向前移位。
那么解题思路就比较明了,右指针向前遍历,增加右边元素到区间中;当区间的和大于target的时候,左指针将左边的元素排出,直到区间的和小于target,就再次让右指针添加。
不难发现,该种方法能够使所有的大于target的连续元素通过判断条件。
代码实现
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int sum = 0, left = 0, right = 0, srtlength = Integer.MAX_VALUE;
for (right = 0; right < nums.length; right++) {
sum += nums[right];
while (sum >= target) {
srtlength = Math.min (srtlength, right - left + 1);
sum -= nums[left];
left++;
}
}
return srtlength == Integer.MAX_VALUE ? 0 : srtlength;
}
}
整体比较简单,但是对于本菜鸡来说,有几个需要注意的点:
- Integer.MAX_VALUE 理论上最大的数;
- Math.min 取小函数;