209. 长度最小的子数组
思路
连续子数组 这不就是暗示滑动窗口吗
滑动窗口
思路
- 使用start、end指针,分别表示滑动窗口的起始、终止位置
- 移动end指针,扩大窗口,直到子数组达到目标值target
- 移动start指针,缩小窗口,直到子数组不再满足>=target
上代码
class Solution {
public int minSubArrayLen(int target, int[] nums) {
//选最大值是为了选一个规范,最后看result是否改变(见return语句)
int result = Integer.MAX_VALUE;
int start = 0;
int end = 0;
int sum = 0;
while (end < nums.length){
//将end处的值加入sum,然后end向后移
sum += nums[end++];
//如果满足要求,就将该滑块的长度与result相比较,小的存入result
while (sum >= target && start < end){
//长度就是end-start
result = Math.min(result,end - start);
//将start处的值从sum中减去,然后start后移
sum -= nums[start++];
}
}
//此处注意,三元运算符是一个表达式,不是一个语句 所以不能单独使用
return result == Integer.MAX_VALUE ? 0 : result;
}
}
巧妙之处
- 选取Integer.MAX_VALUE很巧妙,既不会重复又是一个规范
- 三元运算符是表达式,不能作为语句单独使用(谁报错谁心里明白)
sum += nums[end++]
巧妙的运用先运算后++