- 套不定長的 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 _types;
unordered_map<int,int> _map;
int _curr;
public:
Window(int types): _types(types) {
_curr = 0;
}
void add(int& num) override {
if (_map[num]++ == 0) {
_curr++;
}
}
void erase(int& num) override {
if (--_map[num] == 0) {
_map.erase(num);
_curr--;
}
}
bool check(int& num) override {
return !_map.count(num) && _curr == _types;
}
};
class Solution {
private:
unique_ptr<IWindow> _w;
public:
Solution(): _w(make_unique<Window>(2)) {}
int totalFruit(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;
}
};
class Solution {
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;
}
};