- 套不定長的 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;
}
};