https://leetcode-cn.com/problems/majority-element-ii/
思路:哈希解法就不多说了,没啥意思。说一下进阶的算法,其实之前做过类似的,不过是求出现超过n/2次的元素,核心思想就是成对消耗:每次选取2个不同的元素从数组中删去,那么最后剩下的元素就是可能的答案。证明略,显然这个结论在此题依然成立,那么直接模拟就行。看了官方题解才知道这是摩尔投票法。
class Solution {
public:
vector<int> majorityElement(vector<int>& nums) {
int num1=0,num2=0,ct1=0,ct2=0;
for(int num:nums)
{
if(ct1&&num==num1)
++ct1;
else if(ct2&&num==num2)
++ct2;
else if(!ct1)
num1=num,++ct1;
else if(!ct2)
num2=num,++ct2;
else
--ct1,--ct2;
}
vector<int> ans;
if(ct1&&check(nums, num1))
ans.push_back(num1);
if(ct2&&check(nums, num2))
ans.push_back(num2);
return ans;
}
private:
bool check(const vector<int>& nums, int ele)
{
int minNum=nums.size()/3,ct=0;
for(int num: nums)
{
if(num==ele)
{
if(++ct>minNum)
return 1;
}
}
return 0;
}
};