问题
思路
参考[Major Element]
都是采用moore’s voting algorithm,只不过第一个问题是一定存在。但是本题不存在,投票完了之后需要验证。
写代码需要注意一点:避免m和n重复的情形。
还有循环判断的顺序不能变!!!
代码
class Solution {
public:
vector<int> majorityElement(vector<int>& nums) {
int m = 0, cm = 0;
int n = 0, cn = 0;
int sz = nums.size();
for( int i = 0; i < sz; ++i ){
if( nums[i] == m ) cm++;
else if( nums[i] == n ) cn++;
else if(!cm)
{
m = nums[i];
cm = 1;
}
else if(!cn)
{
n = nums[i];
cn = 1;
}
else
{
--cm;
--cn;
}
}
cm = cn = 0;
for( int i = 0; i < sz; ++i ){
if( nums[i] == m )
++cm;
else if( nums[i] == n )
++cn;
}
std::vector<int> ret;
if( cm > sz/3 )
ret.push_back(m);
if( cn > sz/3 )
ret.push_back(n);
return ret;
}
};