题目
分析
这道题是之前写过的Leetcode169. Majority Element的一个延伸,就是做了一点点小小的变化。关键点还是169里提到的摩尔投票法,在那篇写的很清楚了。
现在的问题是要找出所有出现不少于n/3次的元素,首先可以确定的是满足这样的元素最多只有俩。因为假设有3个,那这三个的数量加起来就>n,显然是错误的,知道了这一点接下来我们就可以直接来找出出现最多的两个众数。
需要注意的是这两个筛选出来的众数不一定是都满足的,举个例子1,1,1,2,3,5,肯定会筛出来1,另一个无论说2、3、5里的哪一个都是不对的。所以需要再遍历一次数组,检查这两个众数出现的次数是否真的大于n/3。
代码
class Solution {
public:
vector<int> majorityElement(vector<int>& nums) {
int l, r, cnt1 = 0, cnt2 = 0;
for (auto a : nums) {
//这里需要写成if elseif 避免l和r重复
if (a == l) cnt1++;
else if (a == r) cnt2++;
// 这里有一个巧妙的处理,解决了l,r的初始化问题。
else if (cnt1 == 0) {
l = a; cnt1 = 1;
}
else if (cnt2 == 0) {
r = a; cnt2 = 1;
}
// a都不是这两者中之一
else {
cnt1--; cnt2--;
}
}
cnt1 = 0, cnt2 = 0;
for (auto a : nums) {
if (a == l) cnt1++;
else if (a == r) cnt2++;
}
vector<int> ans;
if (cnt1 > nums.size() / 3) ans.push_back(l);
if (cnt2 > nums.size() / 3) ans.push_back(r);
return ans;
}
};