题目:
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.
解法一:
最直观的解法是检查每个元素是否为majority element, 两轮循环,算法复杂度为O(n^2)。如果用STL里map里的find函数来查找,时间复杂度可以优化为o(nlogn)。或者将数组排序后在找,时间复杂度也为O(nlogn)。此处不再赘述。
解法二:
分治法:将原数组分为两部分,分别查找两个子数组的majority element,得到A和B两个元素,若A == B则说明该元素就是Majority Element,否则对A和B分别进行判断是否为Majority Element。时间复杂度为O(nlogn)。Accepted的代码:
class Solution {
public:
int devide(int x,int y,vector<int>& nums)
{
if(x==y) return nums[x];
int mid=(x+y)/2;
int left=devide(x,mid,nums);
int right=devide(mid+1,y,nums);
if(left==right) return left;
else
{
int countleft=0;
int countright=0;
for(int i=x;i<=y;i++)
{
if(nums[i]==left) countleft++;
if(nums[i]==right) countright++;
}
return countleft>countright? left:right;
}
}
int majorityElement(vector<int>& nums) {
return devide(0,nums.size()-1,nums);
}
};
解法三:
在网上看到一种线性复杂度(O(n))的算法, Moore’s Voting Algorithm,是Robert S.Boyer 和J Strother Moore于1980年发明的。算法思想:将不同的单词成对删除,最后留下的单词即是majority element。Accepted的代码:
class Solution {
public:
int majorityElement(vector<int>& nums) {
int temp=nums[0];
int count=1;
for(int i=1;i<nums.size();i++)
{
if(count==0)
{
temp=nums[i];
count++;
}
else
{
if(nums[i]==temp) count++;
else count--;
}
}
return temp;
}
};