理解摩尔投票法

摩尔投票法_inventedyv3_摩尔投票法_DEMO_投票法_ 勇于摩尔投票法的一个小Demo,应用场景不广,但是是一个有趣的算法 立即下载

算法题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字(数组非空,一定存在这个数字)。

 摩尔投票法算法的本质思想就是:抵消,抵消,抵消,到不能再抵消为止。

首先,我们先来了解一下是如何抵消的,抵消就是让数组中任意两个不同的元素进行抵消,一直抵消到最后剩下的就是出现次数唱过数组长度一半的数字了;具体的我们可以举一个例子来说明一下,给定的数组为{ 1, 2, 3, 2, 2, 2, 5, 4, 2 },具体抵消的过程为:

  1. 先声明一个数组array,用来存放当前无法抵消的数字;
  2. 遍历题目中给定的数组;第一个元素为 1,此时数组array为空,里面没有元素能够与 1 相互抵消,所以将 1 存入到数组中;
  3. 第二个元素为 2,此时数组array中存在一个 1 可以与 2 相互抵消,抵消之后数组array又变为空;
  4. 后面两个元素 3 和 2,也可相互抵消;遍历到第7个元素 5 的时候数组array为{ 2,2 },这时元素 5 可以与数组array中的任意一个 2 相互抵消,这里不用考虑与哪个 2 进行抵消;
  5. 继续遍历到最后,会发现数组array中仅剩一个 2,所以这个数字就是 2;

上面这个是摩尔投票法的具体流程,接下来我们就要考虑对其进行优化;可能大家会发现数组array的作用好像并不是很大,而且数组中存储的元素都只有一种,因为如果有与数组中元素不同的数字就会产生抵消,不会进行存储,因此我们在实际算法中可以将其替换;使用变量 x 表示数组array中存储的元素,变量votes存储的是其未被抵消的次数,具体思想和上面一样在此就不再过多赘述,直接上代码;

class Solution {
    public int majorityElement(int[] nums) {
        int x = 0, votes = 0;
        for(int num : nums){
            if(votes == 0)
                x = num;
            //如果遍历到的元素num与存储的元素x相等,则x存储的次数+1,否则就-1
            num = num == x ? 1 : -1;
            votes += num;
        }
        return x;
    }
}

到这里这个算法已经全部分享完毕,但是一定会有同学存在这种情况,这个算法的思路也都明白了,自己也会写了,但是好像对不太理解为什么这样就可以保证最后留下的就是出现的次数超过数组长度一半的那个元素?

这里我再举一个例子,玩一个诸侯争霸类的游戏,你放的人口超过了所有总人数的一半,而且保证每次打仗都时一换一的(你方死一个人一定会杀死一个敌人),最后还有人或者的国家胜利;这个时候怎么办 ?对,就是直接选择大混战,所有的管家出来一起打,哪怕是其他国家联合打你一个,那么最后生存的也一定是你,因为你的人口超过了所有总人口的一半,即他们所有国家人加起来也没你的国家人多;如果他们之间也相互攻击,那岂不是更好了,所以只要你的国家不发生内斗,最后赢的一定是你。

 

 

华大HC32F460RS485通信实验 阅读详情

相关推荐

Diebold-Mariano检验

给定两个预测的预测结果,我们希望比较他们的预测结果,以用于预测模型精度的比较。 Diebold-Mariano检验本质是一个t检验,用于检验替代预测的两个损失序列的平均值是否相等。即,它是一系列损失差的零均值的t检验。在存在自相关的情况下,它使用损失差分时间序列标准差的自相关一致性估计。 注意,在使用DM检验式时,假设损失序列是平稳的。 另外,DM检验在小样本数据时往往会拒绝零假设。对于小样本数据,推荐Harvey, Leybourne and Newbold (HLN)检验【1】; 参考文献 【1】htt

weixin_43948357的博客 6565

摩尔投票算法

数组或序列中查找出现次数超过一半。

qq_63917870的博客 1376

告别裸机:在FreeRTOS上为STM32移植SOEM 1.4.0的完整指南

本文详细介绍了在FreeRTOS环境下为STM32H7系列芯片移植SOEM 1.4.0的完整指南,涵盖环境准备、任务架构设计、OSAL层适配及网络驱动优化等关键步骤。通过EtherCAT主站解决方案的实现,帮助开发者构建稳定可靠的工业自动化系统,提升实时通信性能。

weixin_33582311的博客 363

一篇搞懂面试高频算法--摩尔投票算法

【注意:小标题都是上一张图片操作后的总结】

m0_74977981的博客 2339

深入解析uncompyle6反编译pyc文件及常见错误修复指南

本文深入解析了使用uncompyle6工具反编译Python字节码文件(.pyc)的完整流程。针对实践中最高频的KeyError和Python版本范围限制两大错误,提供了详细的修复方案与步骤指南,并分享了处理复杂反编译结果的高级技巧与安全实践,是进行代码恢复、调试与分析的重要参考。

uber9的博客 534

ESP32IDF 通过 PCA9685控制舵机的程序bug处理

esp32 PCA9685 bug 舵机

ztvzbj的博客 726

【算法】摩尔投票算法

本文介绍了摩尔投票算法的相关知识。

代码星辰的博客 2636

在 SAP 中,Primary Cost Element(初级成本要素)与Secondary Cost Element(次级成本要素)的核心区别、作用及业务含义可归纳如下

摘要:SAP中初级成本要素与次级成本要素的核心区别在于:初级要素必须关联FI模块的损益科目,直接影响财务报表,用于记录外部成本(如电费、薪酬);次级要素仅存在于CO模块,用于内部成本分配(如分摊、作业分配),不影响外部报表。初级要素是"外部成本入口",次级要素是"内部成本搬运工",二者共同实现成本的多维度追踪与管理。

金牌架构师 759

对于摩尔投票法的理解

有一个记录商品的管理表,记录商品的id。arr[i]就表示商品的id。商品id可能会重复返回管理表中数量大于商品总数一半的id。例如:arr = {0, 1, 2, 3, 4, 5};

XueZhiXia_的博客 147

毕设-MobileNetV4:给YOLOv8装上轻量化“引擎”——通用瓶颈与C2f融合的实战教程

本文介绍了一种将MobileNetV4与YOLOv8结合的目标检测模型轻量化方案。MobileNetV4通过通用瓶颈(UB)结构实现多任务适配,其核心改进包括动态卷积核、注意力机制和多路径特征聚合,显著提升特征提取能力。作者详细阐述了如何在YOLOv8框架中实现MobileNetV4的通用瓶颈模块,包括"膨胀-卷积-注意力-压缩"的流程设计,并构建完整的backbone网络。该方案通过融合MobileNetV4的轻量化优势与YOLOv8的高效检测架构,在移动设备上实现了精度与速度的良好平

FJN110的博客 505

X书关键词协议搜索

【代码】X书关键词协议搜索。

Codeooo 博客 6377

Python-Leetcode-剑指offer(五月上做题整理)

滚动数组: (1)5-1-面试题39. 数组中出现次数超过一半的数字

越努力 越幸运 669

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

摩尔投票法的理解

摩尔投票法基于这样一个事实,当一个数的重复次数超过数组长度的一半,每次将两个不相同的数删除,最终剩下的就是要找的数。 算法步骤: 1.count = 0;num = nums[0]; 表示从此时开始计算投票。 2.遍历数组,如果接下来出现的数字与num相同,count加1。如果不同,count减1。 3.如果count == 0,表示之前出现的所有数字中num都是可以凑成不同的数对...

shxifs的博客 7726

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

一些摩尔投票法的思考和理解

leetcode169 和229可以参考一下 贴一下自己的leetcode229的代码 class Solution: def majorityElement(self, nums: List[int]) -> List[int]: dic = {} for num in nums: if num in dic: ...

qq_31839461的博客 702

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

如何理解摩尔投票法(力扣的求众数),看了还不会的来砍我

力扣的求众数 可以先看看解题榜第一名做出的摩尔投票法的动图,先存在脑海里 2.看下这里理解: 3.还看不懂?没关系,我来结合这两者进行补充: 比如这个测试用例: 将1,2,3,5,4想象成5个国家的士兵 约定: 1.每个国家的士兵不能内战 2.每个国家的士兵都可以攻击不同国家的士兵 3.每次攻击都是双方同归于尽的 4.最终在战场上活下来的士兵归属的国家算胜利 ** 那么假如有一个国家的士兵超过了参战人数的一半,请问哪个国家胜利? ** 那么显而易见,假如所有不同国家的士兵都去攻击这个大国的士兵(测试用例

weixin_44841849的博客 318

摩尔投票法的个人理解

摩尔投票法的个人理解 摩尔投票法是找出多数元素的算法; 多数元素是出现次数大于n/2的元素; 摩尔投票法就是进行抵消和 合并的过程,首先选定第一个元素,接着往后遍历,若相同则+1,不同则-1。如果为0,就更换为新元素。 由于具体原理和实现其他文章写得很详细,所以在这里就说一下我个人对这个方法的个人理解: 用诸国混战比喻: 先给视觉给到第一个国家的士兵(第一个数组元素),并给这名士兵一盏灯。 这个国家的士兵散布在战场的各处;(设每支队伍数为count,初始count=1) 假设这个战场是一地下暗道(数组

forest11lin的博客 247

从找多数元素题理解摩尔投票法

目录 先看题目:LeetCode169.多数元素 思路一:哈希表法 思路二:中位数法 思路三:摩尔投票法 先看题目:LeetCode169.多数元素 思路一:哈希表法 顺便提一句,如果提前指定了数组中元素,可以使用木桶法,但是这里不适用,只能老老实实用哈希表 class Solution { public: int majorityElement(vector<int>& nums) { map<int,int> m;

沉迷单车的追风少年 541

摩尔投票法推广的理解

对于摩尔投票法可以推广到⌊k /n⌋的情况,也就是给定一个大小为 n 的整数数组,找出其中所有出现超过⌊k /n⌋次的元素,对于k = 2的情况我们可以看成有一个仓库r1, 仓库放着数量为c1的元素,当我们遍历数组中的所有元素的时候当发现当前的元素与r1不等的时候那么c1减1,最后遍历一下数组中的所有元素统计所有与r1相等的数目count,判断count是否大于1 / 2如果大于1 / 2说明当前的元素r1的数目超过数组长度的1 / 2的,对于⌊k /n⌋的情况我们是可以定义k - 1个仓库,当某个仓...

二哈 194

用“打架”来理解摩尔投票法,生动形象一看就懂

用“打架”来理解摩尔投票法,生动形象一看就懂 1.问题提出 摩尔投票法,最简单形象的理解,就是一群人去抢座位。 在某个战乱年代,有m个来自不同阵营的人,要去争抢n个王座,大家都想抢,怎么办呢,那肯定是谁的人多,谁就可以坐上王座呗。比如只有1个王座的话,那人数必须要大于总人数一半(1 / 2)的阵营才可以坐,否则其他阵营的人联合起来就可以把你搞死;有2个王座的话,那人数必须要大于总人数的 (1/3)的两个阵营可以坐,有n个王座,那阵营人数必须大于m * (1 / n)。 那么这个问题抽象化就是:如何从一个

taotao的博客 321

关于用摩尔投票法求解LeetCode 169题-多数元素的理解

这道题有很多种解法,如统计每个数出现的次数,或者排序等,都是比较容易想到的,官方的题解也有提到,这里就不赘述了。 题解链接 力扣 但是摩尔投票法,我是怎么也想不通,看了官方的题解,也搜了网上帖子的说法,都一知半解的。说是互相消耗,到最后胜出的就是最多的,听起来好像理解了,但是实际看代码,还是不理解。 为什么最后一个count = 0后的第一个元素,一定是众数? 首先我们得明白count = 0的意义,然后再来理解最后一个count = 0的意义。 count = 0,说明前面的正反双方都消耗完了,

dingxianding的专栏 1006

编程题—leetcode229. 求众数 II—深入理解摩尔投票法

题目链接 题目描述 给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。 说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1)。 示例 1: 输入: [3,2,3] 输出: [3] 示例 2: 输入: [1,1,1,3,3,2,2,2] 输出: [1,2] 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/probl...

code_AC的博客 376

多数元素,摩尔投票法,简单理解

/* 求多数元素 元素个数大于n/2 , 这里假设数据不为空,并且存在多数元素 例子:23122 中的多数元素就是2 */ 解释:就把这个方法想象成,这个元素,不同的元素都是它的敌人都会和它抵消,那么最后剩下的就是多数元素。因为它的个数大于n/2足以对抗所有的其他元素。 /* 求多数元素 元素个数大于n/2 , 这里假设数据不为空,并且存在多数元素 例子:23122 中的多数元素就是2 */ #include <iostream> using namespace std; int main

吃醋不爱蘸饺子的胡诌乱造 262

【20230301】【剑指1】数学(简单)

理论上用摩尔投票法空间复杂度能得到简化,但是奈何实在难以看懂,暂时先用哈希解决吧。

HYAIWYH的博客 112

leetcode:169. Majority Element

结果貌似正确,但提交heap overflow 了,没被ac, 数组老犯这种错误。 /* 思路: 1.找出两个不同的元素的值存起来,用标记区分 2.默认tmp[0]的个数最多, */ class Solution { public: int majorityElement(vector<int>& nums) { vector<int...

hunter 199

主元素(摩尔投票法)

问题一 在数组中求主元素(在数组中超过数组长度 的元素) 解决方案:摩尔投票法——简单来说就是由于(主元素个数-其余元素个数)>0,所以两个不同的数可以一起删掉,留下的就是主元素 算法流程: cnt=0 major=0 for num in nums loop //相等则+1 if num==major then cnt=cnt+1 e...

思维缜密的博客 494
上一篇: 数据链路层功能总结【轻松理解数据链路层】
下一篇: 一篇文章帮你搞清楚数据链路层在网络中的作用
ppaaaaaaa
博客等级 码龄9年 22粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值