【LeetCode---904】水果成篮---滑动窗口
- 定义一个计数器Counter,HashMap的巧用。
- i是最左边的下标,j为右边的下标,j - i + 1就是这个滑动窗口的长度
- 如果长度大于三,那么就要把最左边的那个数给删掉。
- 因为可能有重复的情况:
- 比如3,3,3,3,1,1,2
- 在加入2的时候,要删除第一种果子3,那么我们就需要i一直往后移动,然后判断是否为0,如果0就删除。
- 这样做的好处是,如果只有一个如:31111222,那么删除一次就可以了。然后i++又变为了下一次的指向,即1的开始位置。
import java.util.HashMap;
public class Solution2 {
public static int totalFruit(int[] tree) {
int ans = 0, i = 0;
Counter count = new Counter();
for (int j = 0; j < tree.length; ++j) {
count.add(tree[j], 1);
while (count.size() >= 3) {
count.add(tree[i], -1);
if (count.get(tree[i]) == 0)
count.remove(tree[i]);
i++;
}
ans = Math.max(ans, j - i + 1);
}
return ans;
}
}
class Counter extends HashMap<Integer, Integer> {
public int get(int k) {
return containsKey(k) ? super.get(k) : 0;
}
public void add(int k, int v) {
put(k, get(k) + v);
}
}