解题思路:题目要求空间复杂度为O(1)
大于1/3
的数不会超过2
个,利用Boyer-Moore
投票算法找到数量最多的两个数,再检查下这俩个数的数量有没有超过1/3
class Solution {
public:
vector<int> majorityElement(vector<int>& nums) {
vector<int>res;
int cnt1, num1, cnt2, num2;
cnt1 = cnt2 = 0;
num1 = num2 = INT_MAX;
for(int i = 0; i < nums.size(); i++)
{
if(num1 == nums[i])
{
cnt1++;
}
else if(num2 == nums[i])
{
cnt2++;
}
else if(cnt1 == 0)
{
num1 = nums[i];
cnt1++;
}
else if(cnt2 == 0)
{
num2 = nums[i];
cnt2++;
}
else
{
cnt1--;
cnt2--;
}
}
//检查得到的两个数有没有超过1/3
cnt1 = cnt2 = 0;
for(int i = 0; i < nums.size(); i++)
{
if(num1 == nums[i]) cnt1++;
else if(num2 == nums[i]) cnt2++;
}
if(cnt1 > nums.size()/3) res.push_back(num1);
if(cnt2 > nums.size()/3) res.push_back(num2);
return res;
}
};