题目描述:
Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋
times.
Note: The algorithm should run in linear time and in O(1) space.
Example 1:
Input: [3,2,3]
Output: [3]
Example 2:
Input: [1,1,1,3,3,2,2,2]
Output: [1,2]
class Solution {
public:
vector<int> majorityElement(vector<int>& nums) {
# 数组中次数大于n/3的元素最多为两个,假设为m和n,那么每次遍历到其中一个数,都让相应的计数加一
# 每次遍历到其他数,让两个计数都减一,假如确实存在两个数符合要求,那么其他数的次数小于n/3,最终两个计数都大于0
# 如果只存在一个数m符合要求,那么为了让它的计数减少到k,最少需要2k个数,因为必须先让一个数的计数增加到k
# 然后再用k个其他的数,让这两个数的计数减少k,因此最终m的计数大于0,所以这种投票的方法保证符合要求的数最终的计数一定大于0
# 但是由于数组中不一定存在两个符合要求的数,所以我们还需要验证得到的m和n是不是符合要求
int m=0, n=0, cm=0, cn=0;
for(auto num:nums)
{
if(num==m) cm++;
else if(num==n) cn++;
else if(cm==0) m=num, cm=1;
else if (cn==0) n=num, cn=1;
else cm--, cn--;
}
vector<int> result;
cm=cn=0;
for (auto num:nums) {
if(num==m) cm++;
else if(num==n) cn++;
}
if (cm>nums.size()/3) result.push_back(m);
if (cn>nums.size()/3) result.push_back(n);
return result;
}
};