• 套不定長的 Sliding Window pattern
class IWindow {
public:
    virtual void add(int& num) = 0;
    virtual void erase(int& num) = 0;
    virtual bool check(int& num) = 0;
    virtual ~IWindow() {}
};

class Window: public IWindow {
private:
    int _types;
    unordered_map<int,int> _map;
    int _curr;
public:
    Window(int types): _types(types) {
        _curr = 0;
    }
    void add(int& num) override {
        if (_map[num]++ == 0) {
            _curr++;
        }
    }
    void erase(int& num) override {
        if (--_map[num] == 0) {
            _map.erase(num);
            _curr--;
        }
    }
    bool check(int& num) override {
        return !_map.count(num) && _curr == _types;
    }
};

class Solution {
private:
    unique_ptr<IWindow> _w;
public:
    Solution(): _w(make_unique<Window>(2)) {}
    
    int totalFruit(vector<int>& fruits) {
        int n = fruits.size();
        int left = 0;
        int right = 0;
        int res = 0;
        while (right < n) {
            int num = fruits[right++];
            while (_w->check(num)) _w->erase(fruits[left++]);
            _w->add(num);
            res = max(res, right-left);
        }
        return res;
    }
};
  • 不囉嗦版
class Solution {
public:
    int totalFruit(vector<int>& fruits) {
        int n = fruits.size();
        int left = 0, right = 0;
        int res = 0;
        int curr = 0;
        unordered_map<int,int> map;
        while (right < n) {
            int num = fruits[right++];
            while (curr == 2 && !map.count(num)) {
                int num2 = fruits[left++];
                if (--map[num2] == 0) {
                    map.erase(num2);
                    curr--;
                }
            }
            if (map[num]++ == 0) {
                curr++;
            }
            res = max(res, right-left);
        }
        return res;
    }
};