• 套不定長的 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 int sum() = 0;
    virtual ~IWindow() {}
};

class Window: public IWindow {
private:
    unordered_map<int,int> _cnt;
    int curr = 0;
public:
    void add(int& num) override {
        curr += num;
        _cnt[num]++;
    }
    void erase(int& num) override {
        curr -= num;
        _cnt[num]--;
    }
    bool check(int& num) override {
        return _cnt[num] == 1;
    }
    int sum() override {
        return curr;
    }
};

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