- 套不定長的 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 _t;
unordered_map<int,int> _map;
public:
Window(int threshold): _t(threshold) {}
void add(int& num) override {
_map[num]++;
}
void erase(int& num) override {
_map[num]--;
}
bool check(int& num) override {
return _map[num] == _t;
}
};
class Solution {
private:
unique_ptr<IWindow> _w;
public:
int maxSubarrayLength(vector<int>& nums, int k) {
_w = make_unique<Window>(k);
int n = nums.size();
int left = 0, right = 0, res = 0;
while (right < n) {
int num = nums[right++];
while (_w->check(num)) _w->erase(nums[left++]);
_w->add(num);
res = max(res, right-left);
}
return res;
}
};
class Solution {
private:
unordered_map<int,int> cnt;
public:
int maxSubarrayLength(vector<int>& nums, int k) {
int n = nums.size(), left = 0, right = 0, res = 0;
while (right < n) {
int num = nums[right++];
while (cnt[num] == k) {
cnt[nums[left++]]--;
}
cnt[num]++;
res = max(res, right - left);
}
return res;
}
};