classIWindow {
public:virtualvoid add(int& num) =0;
virtualvoiderase(int& num) =0;
virtualboolcheck(int& num) =0;
virtual~IWindow() {}
};
classWindow:public IWindow {
private:int _types;
unordered_map<int,int> _map;
int _curr;
public: Window(int types): _types(types) {
_curr =0;
}
voidadd(int& num) override {
if (_map[num]++==0) {
_curr++;
}
}
voiderase(int& num) override {
if (--_map[num] ==0) {
_map.erase(num);
_curr--;
}
}
boolcheck(int& num) override {
return!_map.count(num) && _curr == _types;
}
};
classSolution {
private: unique_ptr<IWindow> _w;
public: Solution(): _w(make_unique<Window>(2)) {}
inttotalFruit(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;
}
};
不囉嗦版
classSolution {
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;
}
};