摩尔投票法求众数

题目来自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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值