方法一:map
key-数字 value-出现次数
int majorityElement(vector<int> &num)
{
int ans = 0, mx = 0;
map<int, int> m;
for (auto ele : num)
{
if (m.count(ele))
m[ele]++;
else
m.insert(make_pair(ele, 1));
}
map<int, int>::iterator it;
for (it = m.begin(); it != m.end(); it++)
if (it->second > mx)
mx = it->second, ans = it->first;
return ans;
}
方法二:排序
如果ai==ai/2 ans=ai
int majorityElement(vector<int> &nums)
{
sort(nums.begin(), nums.end());
int len = nums.size(),n;
if(len&1)
n = (len >> 1) ;
else
n = (len -1) >> 1;
for (int i = 0; i < len;i++)
if(nums[i]==nums[i+n])
return nums[i];
return 0;
}
方法三:Boyer-Moore Voting Algorithm
int majorityElement(vector<int> &nums)
{
int ans, count=0;
for(auto ele:nums){
if(!count)
ans = ele;
count += (ele == ans) ? 1 : -1;
}
return ans;
}
方法四:归并
int count(vector<int> &nums, int num, int lo, int hi)
{
int cnt = 0;
for (int i = lo; i <= hi; i++)
if (nums[i] == num)
cnt++;
return cnt;
}
int getmajority(vector<int> &nums,int lo,int hi)
{
if(lo>=hi)
return nums[lo];
int mid = (lo + hi) >> 1;
int left=getmajority(nums, lo, mid);
int right = getmajority(nums,mid+1, hi);
int lcnt = count(nums, left, lo, hi);
int rcnt = count(nums, right, lo, hi);
return lcnt>rcnt?left:right;
}
int majorityElement(vector<int> &nums)
{
return getmajority(nums, 0, (int)nums.size()-1);
}
参考leetcode solutions实现的方法。
题解LINK