摩尔投票法——手撕“绝大多数“问题的算法金手指

本文介绍了摩尔投票法,一种用于解决在不确定数量的对象中找到最多票数候选人的算法。该方法通过抵消和计数,可以在O(n)时间内找到多数元素。文章通过LeetCode题目实例解释了算法原理,并展示了如何应用到求众数II的问题上,包括处理可能出现一个或两个众数的情况。
摘要由CSDN通过智能技术生成

传统艺能😎

小编是双非本科大一菜鸟不赘述,欢迎大佬指点江山(QQ:1319365055)
此前博客点我!点我!请搜索博主 【知晓天空之蓝】
乔乔的gitee代码库(打灰人欢迎访问,点我!

过渡区🤣

现在是北京时间20:00,说实话前天看到一道力扣的题,饶有兴趣,基于老毛病,烂到今天才拿来写,这一写不得了,把 ye 整破防了,于是乎打算恭恭敬敬安排一篇博客,多是一件美事~
在这里插入图片描述

正片开始👀

概念🤔

嘛是摩尔投票法
简单来说就是投票法,算法解决的问题是如何在任意多的候选人,选出获得票数最多的那个。常见的算法是扫描一遍选票,也就是遍历,对每个候选人进行统计的选票进行统计。

那我遍历难道不香吗?

在这里插入图片描述
这里就要讲一下投票法的过人之处

优点🤔

当执行有序情况时,只要找到中位数,然后检查中位数的个数是否超过选票的一半即可。但是当对象的数目不定时,统计选票可能会执行较长时间,相比原来的时间复杂度 O(n) ,可能需运行 O(n^2) 的时间。

针对无序且对象不定的情况,摩尔投票法应运而生。

算法核心😎

摩尔投票法的关键就是抵消计数,抵消过程类似于是在进行投票,然后计数我们可以脑补一个情形:当三人中的一人得票数远超其他两人时,我们就可以进行等量对消,消完还有票的自然就是得票数最多的那个,模拟如下:(ppt手残勿喷)
在这里插入图片描述
在这里插入图片描述

实现😎

基本思路就是由一个计数器维护,在进行比较过程中,不同票消掉,相同票保留,如果消的没有了就直接放进去然后继续上述过程,直到维护对象只剩一个,就是我们要找的最大得票者(众数)。

基于LeetCode真题实践,先看一个初级栗子:

169. 多数元素
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例:
输入:[2,2,1,1,1,2,2]
输出:2

来源:力扣(LeetCode)

我最初的思路是哈希思想,qsort 之后用最大的元素 malloc 一块新的空间,桶排后用 count 进行++,最后输出 count 最大的。有点麻烦而且我忽视了一个最大的问题就是负数的存在,垮掉~

根据我们算法的思路,针对目标数组 nums,首先创建一个变量来执行计数器 count 再创建一个新数组 a 进行比对,因为始终是目标数组的内部元素比较,我可以直接把 nums 首元素赋给 a ,比较时从第二个元素开始和 a 比较,如果相同,count ++;不同消掉,count --;没有了就往里拿。

int majorityElement(int* nums, int numsSize){
   
    int count = 1;
    int a = nums[0];
    for(int i =1;i<numsSize;i++)
    {
   
        if(nums[i]==a)
        {
   
            count++;
        }
        
  • 45
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 71
    评论
评论 71
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乔乔家的龙龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值