水果成篮-越短越合法
904. 水果成篮 - 力扣(LeetCode)
Solution
子数组越长,包含的元素越多,越可能不满足题目要求;反之,子数组越短,包含的元素越少,越可能满足题目要求。本题属于「越短越合法」,有这种性质的题目,可以用滑动窗口解决。
枚举子数组的右端点 right。同时用一个哈希表维护子数组内每个元素的出现次数,用一个变量cnt维护哈希表的大小。
如果 fruits[right] 加入哈希表后,发现哈希表的大小超过了 2,那么子数组不满足要求。移动子数组的左端点 left,把 fruits[left] 的出现次数减一,直到哈希表中的元素种数等于 2。
⚠注意:如果 fruits[left] 的出现次数变成 0,减少cnt,表示子数组内少了一种元素。如果不移除,我们无法通过 cnt 的大小判断窗口中的元素种数。
class Solution {
public:int totalFruit(vector<int>& fruits) {int n = fruits.size();unordered_map<int, int> already;int l = 0, ans = 0, cnt = 0;for (int r = 0; r < n; ++r) {int cur = fruits[r];already[cur]++;if (already[cur] == 1)cnt++;while (cnt > 2) {if (already[fruits[l]] == 1)cnt--;already[fruits[l]]--;l++;}ans = max(ans, r - l + 1);}return ans;}
};