基本思路
-
枚举右,维护左
-
用哈希表存储数组中的元素及其出现的次数,当 x(右) 出现时,查找 k - x(左),若找到则 cnt[k - x]-- ,即出现次数减一(当然,这里只能是从1减到0,且反推到找到的并列条件是出现次数为真),注意这里不统计 x 的出现次数,即为题目所要求的两个元素同时移除的操作;若找不到则 cnt[x]++
-
枚举的右,在找不到要维护的左时,才在哈希表中统计出现次数;找到要维护的左时,此时左的出现次数必然为1,将左的出现次数减1,右的出现次数不计入统计;
class Solution {
public:
int maxOperations(vector<int>& nums, int k) {
int ans = 0;
unordered_map<int,int> cnt;
for(int x : nums) {
auto it = cnt.find(k - x);
if(it != cnt.end() && it->second) {
it->second--;
ans++;
}
else {
cnt[x]++;
}
}
return ans;
}
};