滑动窗口
- 窗口内是什么?
- 如何移动窗口的起始位置?
- 如何移动窗口的结束位置?
209.长度最小的子数组
题目链接:. - 力扣(LeetCode)
题目讲解:代码随想录
题目思路:(暴力会超时)只用一个for循环,遍历窗口的终止位置。
时间复杂度: O(n)
窗口就是 满足其和 ≥ s 的长度最小的 连续 子数组。
窗口的起始位置如何移动:如果当前窗口的值大于等于s了,窗口就要向前移动了(也就是该缩小了)。
窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int left = 0;
int sum = 0;
int lengthRes = Integer.MAX_VALUE; //用最大的限制一下
for(int right = 0;right < nums.length;right++){
sum = sum + nums[right];
while(sum >= target){
lengthRes = lengthRes > (right - left + 1) ? (right - left + 1) : lengthRes;
sum = sum - nums[left];
left++;
}
}
return lengthRes < Integer.MAX_VALUE ? lengthRes : 0;
}
}
904.水果成篮
题目链接:. - 力扣(LeetCode)
题目思路:哈希表 + 滑动窗口
class Solution {
public int totalFruit(int[] fruits) {
int n = fruits.length;
int ans = 0;
int total = 0;
int i = 0;
int[] kind = new int[n];
for(int j = 0;j < n;j++){
if(++kind[fruits[j]] == 1)total++;
while(total > 2){
if(--kind[fruits[i++]] == 0) total--;
}
ans = Math.max(ans,j-i+1);
}
return ans;
}
}