方法一
建立一个元素计数的map
int majorityElement(vector<int>& nums) {
map<int,int> ref;
int len = nums.size();
for(int i = 0;i < len;i++){
if(ref.find(nums[i]) == ref.end())
ref[nums[i]] = 1; //添加key
else
ref[nums[i]]++;
}
for(map<int,int>::iterator it = ref.begin();it != ref.end();it++){
if(it->second > len/2)
return it->first;
}
return -1;
}
此题不宜用分治法,因为可能存在重复元素
方法二
摩尔投票方法(可参考博文)
众数出现次数超过一半,所以众数和剩下的数字相抵,最后剩下的就是众数。
从数组起始开始,设置计数为1,第一个元素为参考数,依次遍历数组元素,若当前元素与参考数相同,计数加一,当前元素与参考数不同,计数减一。当计数为0的时候,表示部分众数与部分其他元素已相抵完,此时重新设置计数与参考数。设置的最后一个参考数即为众数。
int majorityElement(vector<int>& nums) {
int cnt = 1;
int res = nums[0];
int len = nums.size();
for(int i = 1;i < len;i++){
if(cnt == 0)
{
cnt = 1;
res = nums[i];
}
else if(nums[i] == res)
cnt++;
else
cnt--;
}
return res;
}