题目来自leetcode题库169求众数 - 力扣(LeetCode)
题目描述:
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
此题中的众数指明数量占总体的一半或以上,且一定存在该数。
你可以假设数组是非空的,并且给定的数组总是存在众数。
示例 1:
输入: [3,2,3]
输出: 3
示例 2:
输入: [2,2,1,1,1,2,2]
输出: 2
经学习,采用摩尔投票法
int majorityElement(int* nums, int numsSize)
{
int candidate,count;//前者保存遍历的数字后者保存数字出现次数
int i;
candidate=nums[0];
count=1;//赋初值
for(i=1;i<numsSize;i++)//时间复杂度为O(n)
{
if(nums[i]==candidate) //如果遍历到的值和前一个相同
count++;
else
count--;
if(count==0) 当count等于0时
{
candidate=nums[i]; candidate重新赋值为新遍历的数
count=1;//count重新赋值为1
}
}
return candidate;
}
下面是大佬秀操作的代码(不是我)
其核心思想依旧是摩尔投票法,不过要更简洁
int majorityElement(int* nums, int numsSize) {
int mode;
int num=0;
for (int i=0; i<numsSize; i++)
{
if ( num==0 )
{
mode = nums[i];
num++;
}
else if ( mode == nums[i] )
{
num++;
}
else
{
num--;
}
}
return mode;
}
自制的六组数据全部通过嘿嘿嘿
int main()
{
int a[6]={1,2,4,2,2,4};
int b[8]={2,3,5,7,3,3,3,3};
int c[4]={99,88,77,77};
int d[6]={123,321,213,123,123,123};
int e[3]={2,3,2};
int f[3]={0,1,0};
if(majorityElement(a,6)!=2)
printf("测试1不通过");
else if(majorityElement(b,8)!=3)
printf("测试2不通过");
else if(majorityElement(c,4)!=77)
printf("测试3不通过");
else if(majorityElement(d,6)!=123)
printf("测试4不通过");
else if(majorityElement(e,3)!=2)
printf("测试5不通过");
else if(majorityElement(f,3)!=0)
printf("测试6不通过");
else
printf("测试通过!");
return 0;
}