题目链接
题目分析
这个题要我们求一个子数组,子数组意味着连续,而且这个题的数字全部都是正整数,刚好满足滑动窗口的条件,毫不犹豫就死命滑就完事了。
实现代码
class Solution {
public int minSubArrayLen(int s, int[] nums) {
//防止空测试用例出现
if(nums.length < 1){
return 0;
}
//使用滑动窗口思想,我们把慢指针调到-1,快指针从0开始
int slow = -1;
int fast = 0;
//记录当前滑动窗口内的和
int sum = 0;
//使用一个较大的数来进行初始化res结果
int res = nums.length+1;
//当前滑动窗口内的长度
int cur = 0;
while(fast < nums.length){
//累加和并且累加长度
sum += nums[fast++];
cur++;
//当慢指针比快指针小并且滑动窗口内的和大于等于s的时候,开始收缩滑动窗口
while(slow < fast && sum >= s){
//获取res和当前长度res中较小的值
res = Math.min(res,cur);
//这里由于我们slow从-1开始,要先自增再使用
sum -= nums[++slow];
//滑动窗口左边界收缩
cur--;
}
}
//注意,这里要增加一个判断,否则会出现整个数组都不满足大于等于s的条件而导致的输出错误。
return res == nums.length+1?0:res;
}
}
总结
今天的每日一题还算是比较简单了,但是进阶的思想一开始还没想到。看了评论区才知道原来是要结合前缀和的思想来做。因为全部都是正数,我们的前缀和可以是递增的,因为nlogn的时间复杂度一般二分思想,而二分的基础就是有序。
容我再思考下:)