classIWindow {
public:virtualvoid add(int& num) =0;
virtualvoiderase(int& num) =0;
virtualboolcheck(int& num) =0;
virtualintsum() =0;
virtual~IWindow() {}
};
classWindow:public IWindow {
private: unordered_map<int,int> _cnt;
int curr =0;
public:void add(int& num) override {
curr += num;
_cnt[num]++;
}
voiderase(int& num) override {
curr -= num;
_cnt[num]--;
}
boolcheck(int& num) override {
return _cnt[num] ==1;
}
intsum() override {
return curr;
}
};
classSolution {
private: unique_ptr<IWindow> _w;
public: Solution(): _w(make_unique<Window>()) {}
intmaximumUniqueSubarray(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;
}
};
不囉嗦版
classSolution {
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;
}
};