参考
摩尔投票法讲解
http://www.cnblogs.com/grandyang/p/4606822.html
向上取整和向下取整。
http://blog.sina.com.cn/s/blog_a3137f350100zxy7.html
169. Majority Element
https://leetcode.com/problems/majority-element/
229. Majority Element II
https://leetcode.com/problems/majority-element-ii/、
ac代码如下,注意点见注释
class Solution {
public:
vector<int> majorityElement(vector<int>& nums) {
int len = nums.size();
vector<int> ans;
if(len == 0)
return ans;
if(len == 1)
{
ans.push_back(nums[0]);
return ans;
}
//最多两个人可以大于n/3,初始的cnt1 cnt2都是0
int c1 = nums[0];
int c2 = nums[0];
int cnt1 = 0;
int cnt2 = 0;
// i仍然从0开始
for(int i=0;i<len;i++)
{
int cur = nums[i];
if(cur == c1){
cnt1 ++;
}else if(cur == c2){
cnt2 ++;
}else{
if(cnt1 == 0)
{
c1 = cur;
cnt1 = 1;
}else if(cnt2 == 0){
c2 = cur;
cnt2 = 1;
}else{ // 这里两个cnt都要减去1
cnt1 --;
cnt2 --;
}
}
}// end for
// 重新遍历
cnt1 = 0;
cnt2 = 0;
for(int i=0;i<len;i++){
if(c1 == nums[i])
cnt1 ++;
if(c2 == nums[i])
cnt2 ++;
}
if(cnt1 > len/3)
ans.push_back(c1);
// 判断重复
if(c2 != c1 && cnt2 > len /3){
ans.push_back(c2);
}
return ans;
}
};