滑动窗口
滑动窗口有两大类基本问题:
1.找最小窗口
基本思想:定义两个指针left和right,left指针控制开始位置,right指针控制结束位置,right指针不断向右移动直到窗口内满足条件,记录窗口大小之后left指针向右移动缩小窗口大小,每次缩小后判断是否依然满足条件,如果满足就更新窗口大小,直到不满足条件时right指针继续向右移动直到满足条件,以此类推找到符合条件的最小窗口。
//leetcode-209
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int left = 0;
int result = Integer.MAX_VALUE;
int sum = 0;
for(int right = 0; right < nums.length; right++){
sum += nums[right];
while(sum >= target){
result = result < (right - left + 1) ? result : (right - left + 1);
sum -= nums[left++];
}
}
return result == Integer.MAX_VALUE ? 0 : result;
}
}
2.找最大窗口
基本思想:定义两个指针left和right,left指针控制开始位置,right指针控制结束位置,right指针不断向右移动直到窗口内刚刚超出条件,之后left指针向右移动缩小窗口大小,每次缩小后判断是否满足条件,直到刚刚满足条件时right指针继续向右移动直到再次超出条件,right指针每次移动前都要更新窗口大小,以此类推找到符合条件的最大窗口大小。
//leetcode-904
class Solution {
public int totalFruit(int[] fruits) {
int left = 0;
int num = 0;
int count = 0;
int []freq = new int[fruits.length];
for(int right = 0; right < fruits.length; right++){
//如果加入的是新的水果类别
//将手中水果种类数量+1
if(freq[fruits[right]] == 0){
count++;
}
freq[fruits[right]]++;
//当存到第三种水果时
//一直减到只有二种水果在数组中
while(count > 2){
//减掉最早的一个水果树
freq[fruits[left]]--;
if(freq[fruits[left]] == 0){
count--;
}
left++;
}
num = (right - left + 1) > num ? (right - left + 1) : num;
}
return num;
}
}
未完待续。。。