CSDN话题挑战赛第2期
参赛话题:学习笔记
题目链接:力扣
- 题目分析
看到这题,首先想到是暴力求解,两次for循环,找出开头和结尾,取区间值。这样处理就容易超时,而且不是最优解。所以我们想到用滑动窗口方法来解决。
- 做题思路
滑动窗口解决这题目,利用两个指针,前后指针组成一个类似于窗口的区间,通过不断调节两个指针位置,改变区间大小。
- 本题代码及注释以及注意点
class Solution { public int minSubArrayLen(int target, int[] nums) { int result = Integer.MAX_VALUE; int head = 0; int sum = 0; // 滑动窗口固定开始位置,移动tail结束位置。 for(int tail = 0 ; tail < nums.length ; tail++){ sum+=nums[tail]; //while循环不是if条件,因为有肯能sum = sum - nums[head] >= target的情况。 //最开始写就是if判断,发现有上面这种情况,需要不断滑动窗口。 while(sum>=target){ result = result < tail-head+1?result:tail-head+1; sum = sum - nums[head]; head++; } } //判断是为了判断区间为0的状态 return result= result==Integer.MAX_VALUE?0:result ; } }
- 小技巧
滑动窗口解决区间问题
关注公众号,点点不迷路,一起学习Java一起刷题