水果成篮 - C++力扣904题

题目链接:https://leetcode.com/problems/fruit-into-baskets/description/

解题思路

这题其实也是一个类似于滑动窗口的问题,但是其实还是模拟一边就能过,难度算是中等偏下吧,没什么太大的难点。

首先我们先弄一个哈希表,然后每次遍历的时候都检查是否为新的树,如果是的话那我们就从左边开始向前,每次向前都在哈希表里面 -1,直到某个树的水果为 0,然后再将新的果树的水果记录下来。如果不是新的果树那就不断 +1 就行了。然后最后取左边到右边的距离的最大值。

完整代码:

class Solution {
public:
    int totalFruit(vector<int>& fruits) {
        int ans = 0, i = 0, j = 0;

        unordered_map<int, int> map;

        while(j < fruits.size()) {
            map[fruits[j]]++;
            while(map.size() > 2) {
                map[fruits[i]]--;
                if(map[fruits[i]] == 0) map.erase(fruits[i]);
                i++;
            }
            ans = max(ans, j - i + 1);
            j++;
        }

        return ans;
    }
};