链接
题目
给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋
次的元素。
示例
示例 1:
输入:[3,2,3]
输出:[3]示例 2:
输入:nums = [1]
输出:[1]示例 3:
输入:[1,1,1,3,3,2,2,2]
输出:[1,2]
说明
1 <= nums.length <= 5 * 104
-10e9 <= nums[i] <= 10e9
进阶
尝试设计时间复杂度为 O(n)、空间复杂度为 O(1)的算法解决此问题。
思路
最简单的方法就是用一个哈希表统计每个数出现的频率,最后输出大于n/3的数,然而此方法需要额外的O(n)的空间复杂度。
摩尔投票法:参考求大于整个数组半数以上的数的摩尔投票解法,只不过这里变成了三个阵营打架,三个不同变量之间进行抵消。
C++ Code
class Solution {
public:
vector<int> majorityElement(vector<int>& nums) {
int N1=0, N2=0, cnt1=0, cnt2=0;
for(auto x:nums)
{
if(cnt1>0 && x==N1) cnt1++;
else if(cnt2>0 && x==N2) cnt2++;
else if(cnt1==0){N1=x; cnt1++;} //第一个数已经全被消灭,换新的数
else if(cnt2==0){N2=x; cnt2++;} //第二个数已经全被消灭,换新的数
else {cnt1--; cnt2--;} //遇到第三个数
}
cnt1=0;cnt2=0;
for(auto x:nums)
{
if(x==N1) cnt1++;
if(x==N2) cnt2++;
}
vector<int> result;
if(cnt1>nums.size()/3) result.push_back(N1);
if(cnt2>nums.size()/3 && N2!=N1) result.push_back(N2);
return result;
}
};