原题链接:https://leetcode.com/problems/majority-element/
原题:
Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.
You may assume that the array is non-empty and the majority element always exist in the array.
题意:
给你一个大小为n的数组,要你找出主元素 (即出现次数超过n/2的元素)
思路:
一。 用一个hashmap来储存元素出现的次数,但是这样不如第二种方法
二。 用一种叫做Moore’s Voting Algorithm的算法, 该算法的时间复杂度为O(n), 空间复杂度为O(1),因为数组中若与非主元素成对消除,无论消除多少对,主元素依然在新数组中是主元素。所以我们可以把第一个数作为主元素,然后计数,若遇到的元素是一样的,则计数+1,否则-1,若计数等于,则取下一个数为主元素。最后只要遍历一遍数组,就可以找到主元素。
hashmap解法:
class Solution {
public:
int majorityElement(vector<int>& nums) {
unordered_map<int,int> map;
for(int i=0;i<nums.size();i++){
if(map.find(nums[i])==map.end()){
map[nums[i]]=1;
}
else map[nums[i]]++;
if(map[nums[i]]>nums.size()/2) return nums[i];
}
return 0;
}
};
Moore’s Voting Algorithm法:
int count = 0;
int candidate;
for(int i = 0; i < n; ++i)
{
if(count == 0)
{
candidate = a[i];
}
if(candidate == a[i])
++count;
else
--count;
}