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的一维数组,找出majority element。该数是数组中出现次数超过n/2次的元素。
你可以认为数组是非空的且majority element一定存在。
暴力求解法
通过两层循环将每个元素与后面的元素进行比较寻找majority element:
int majorityElement(int* nums, int numsSize) {
int n=1;
int i,j,majElement=0;
if(numsSize==1) //数组只有一个元素
return majElement=*nums;
else
{
for(i=0;i<numsSize;i++)
{
for(j=i+1;j<numsSize;j++)
{
if(*(nums+i)==*(nums+j))
n++;
if(n>(numsSize/2))
{
majElement=*(nums+i);
break;
}
}
if(n>(numsSize/2)) //已经找到majElement
break;
else
n=1;
}
return majElement;
}
}
算法复杂度为O(n^2),提交时由于Time Limit Exceeded失败。
Moore voting algorithm
每找出两个不同的element,就成对地删除,最终剩下的一定是majority number。
时间复杂度为O(n)
int majorityElement(int* nums, int numsSize) {
int count=1;
int i,majElement=0;
if(numsSize==1)
return majElement=*nums;
else
{
majElement=*nums; //将第一个元素值赋给maj
for(i=1;i<numsSize;i++)
{
if(majElement!=*(nums+i))
{
count--;
if(count<0)
{
majElement=*(nums+i);
count=1;
}
}
else
count++;
}
return majElement;
}
}
提交结果如下: