【LeetCode---904】水果成篮---滑动窗口

【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);
    }
}
posted @ 2022-03-11 22:19  DarkerG  阅读(66)  评论(0编辑  收藏  举报