leetcode#229 求众数II
题目:
给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。
进阶:尝试设计时间复杂度为 O(n)、空间复杂度为 O(1)的算法解决此问题。
示例:
输入:[3,2,3]
输出:[3]
思路:
摩尔投票法:
原先的是两个不同的消去,现在换成三个不同的消去就可以了,设两个候选人a,b,如果当前数和a,b不同,那么说明他们三个可以消去了,a,b的票数各减一,如果和a,b相同就可以加票,如果a,b票数小于0进行换届。
代码:
class Solution
{
public:
vector<int> majorityElement(vector<int> &nums)
{
vector<int> ans;
int n = nums.size();
int c1 = nums[0], c2 = nums[0];
int t1 = 0, t2 = 0;
for (int i = 0; i < n; ++i)
{
int now = nums[i];
if (now == c1)
t1++;
else if (now == c2)
t2++;
else
{
if(t1-1<0)
c1 = now, t1 = 1;
else if(t2-1<0)
c2 = now, t2 = 1;
else
--t1, --t2;
}
}
int cnt1 = 0, cnt2 = 0;
for (int i = 0; i < n; ++i)
if (nums[i] == c1)
cnt1++;
else if (nums[i] == c2)
cnt2++;
if (cnt1 > n / 3)
ans.push_back(c1);
if (cnt2 > n / 3)
ans.push_back(c2);
return ans;
}
};