Problem: 209. 长度最小的子数组
思路
滑动窗口
解题方法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TI9rpO7j-1679042950523)(https://pic.leetcode.cn/1679037692-EtLfLk-%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20230317152116.jpg)]
复杂度
- 时间复杂度:
O ( n ) O(n) O(n)
不要以为for里放一个while就以为是O(n^2)啊, 主要是看每一个元素被操作的次数,每个元素在滑动窗后进来操作一次,出去操作一次,每个元素都是被操作两次,所以时间复杂度是 2 × n 也就是O(n)
- 空间复杂度:
O ( n ) O(n) O(n)
Code
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int left = 0;
int sum = 0;
int result = Integer.MAX_VALUE;
int length = nums.length;
for(int right = 0;right < length;right++){
sum += nums[right];
while(sum >= target) {//left一次循环里面可能不止前进一次,所以要用while
result = Math.min(result,right - left + 1);
//因为right++一直有,所以往后滑动窗口长度可能会变大的
//所以要用Matg.min取最小长度
sum -= nums[left++];
}
}
return result == Integer.MAX_VALUE ? 0 : result;
}
}