• 套不定長的 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 _t;
    unordered_map<int,int> _map;
public:
    Window(int threshold): _t(threshold) {}
    void add(int& num) override {
        _map[num]++;
    }
    void erase(int& num) override {
        _map[num]--;
    }
    bool check(int& num) override {
        return _map[num] == _t;
    }
};
class Solution {
private:
    unique_ptr<IWindow> _w;
public:
    int maxSubarrayLength(vector<int>& nums, int k) {
        _w = make_unique<Window>(k);
        int n = nums.size();
        int left = 0, right = 0, res = 0;
        while (right < n) {
            int num = nums[right++];
            while (_w->check(num)) _w->erase(nums[left++]);
            _w->add(num);
            res = max(res, right-left);
        }
        return res;
    }
};
  • 不囉嗦版
class Solution {
private:
    unordered_map<int,int> cnt;
public:
    int maxSubarrayLength(vector<int>& nums, int k) {
        int n = nums.size(), left = 0, right = 0, res = 0;
        while (right < n) {
            int num = nums[right++];
            while (cnt[num] == k) {
                cnt[nums[left++]]--;
            }
            cnt[num]++;
            res = max(res, right - left);
        }
        return res;
    }
};