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