摩尔投票法——代码实现及注释(力扣169题:找出列表中多数元素)

news2024/11/19 17:52:32

 题源:. - 力扣(LeetCode)

目录

一、摩尔投票法

1.1 关键思想

1.2 时空复杂度

1.3 算法详细步骤

1.4 代码

1.5 算法理解


一、摩尔投票法

摩尔投票法(Boyer–Moore Majority Vote Algorithm),也被称为“多数投票法”,是一种在数组或序列中查找出现次数超过一半的主要元素的算法。这种算法的核心理念为 票数正负抵消 ,主要思想是通过不同元素之间的抵消来找到可能的主要元素候选者,并在最后验证候选者是否真正满足要求。

题目:

1.1 关键思想

让每对不同的数字互相“抵消”,就像投票一样。具体做法是,让两个不同的数字相互“消掉”,直到没有可以抵消的数字为止。最后剩下的数字就很有可能是出现次数最多的数字。

1.2 时空复杂度

该算法的时间复杂度为O(n),空间复杂度为O(1)

1.3 算法详细步骤

        1、初始化: 票数统计 count = 0 , 假设目前的候选数是 candidate。
        2、循环: 遍历数组 nums 中的每个数字 num 。
                当 票数 count 等于 0 ,则假设当前数字 num 是众数。
                当 num = candidate ,票数 candidate 自增 1 ,当 num != candidate 时,票数 candidate 减 1 。
        3、返回值: 返回 candidate 即可。

若不好理解,可以去看1.5算法理解

1.4 代码

(1)直接贴在力扣代码处即可(python3)

class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        # 如果数组为空,则没有多数元素,直接返回
        if not nums:
            return 
        # 初始化计数器为0,候选多数元素为None 
        count = 0
        candidate = None
        # 遍历数组中的每一个元素
        for num in nums:
            # 如果当前计数器为0,说明之前的候选多数元素已经被抵消完了,此时将当前元素设为新的候选多数元素 
            if count == 0:
                candidate = num
            # 如果当前元素等于候选多数元素,则计数器加1  
            if num == candidate:
                count += 1
            # 如果当前元素不等于候选多数元素,则计数器减1  
            else:
                count -= 1
        # 在遍历结束后,candidate中保存的可能是一个多数元素,但也可能不是(例如,在存在多个出现次数相同的元素且都不超过一半时)  
        candidate_count = 0
        for num in nums:
            if num == candidate:
                candidate_count += 1
        # 检查candidate是否真的是多数元素
        if candidate_count > len(nums) / 2:
            return candidate

1.5 算法理解

(1)假设nums = [3,2,3],要求返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

开始遍历:

        遍历3:

                candidate = 3, count = 0 +1

        遍历2:

                candidate = 3, count = 1 - 1 = 0 (扫描到了和当前候选3不一样的数字2,所以要减去1)

        遍历3:

                candidate = 3, count = 0 + 1 = 1         

返回candidate            

(2)假设nums = [1,2,3,2,2,2,5,4,2],要求返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

开始遍历:

        遍历1:

                candidate = 1, count = 0 +1

        遍历2:

                candidate = 1, count = 1 - 1 = 0 (扫描到了和当前候选1不一样的数字2,所以要减去1)

        遍历3:

                candidate = 3, count = 0 + 1 = 1 

        遍历2:

                candidate = 3, count = 1 - 1 = 0

        遍历2:

                candidate = 2, count = 0 + 1 = 1(由于前面已经抵消掉count = 0,重新选一个候选数2)

        遍历2:

                candidate = 2, count = 1 + 1 = 2

        遍历5:

                candidate = 2, count = 2 - 1 = 1

        遍历4:

                candidate = 2, count = 1 - 1 = 0

        遍历2:

                candidate = 2, count = 0 + 1 = 1       

返回candidate     

 如果众数不在前两位,就会有非众数之间的抵消。因为非众数之间内耗,只会进一步使得众数更占优势。 比如众数如果是2,且都在数组尾部,前面其他数字内耗完了,最后使得count大于0的只可能是2。

参考文献:. - 力扣(LeetCode)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1710066.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

新版idea配置git步骤及项目导入

目录 git安装 下载 打开git Bash 配置全局用户名及邮箱 查看已经配置的用户名和邮箱 在IDEA中设置Git 问题解决 项目导入 git安装 下载 进入官网 Git - Downloads 点击所属本机系统,window如下图 选择64位安装 按照默认步骤一直下一步即可 打开git Bash …

倒计时 1 天!「飞天技术沙龙-CentOS 迁移替换专场」演讲亮点一览

各位开发者们: 「飞天技术沙龙 - CentOS 迁移替换专场」即将于本周三在北京召开!昨天,小龙为参会者公布了详细参会指南,今天带大家了解各演讲内容亮点。 活动时间:5 月 29 日(本周三) 13:30-17…

webpack构建流程

对webpack的理解: webpack 是一个用于现代 JavaScript 应用程序的静态模块打包工具 可以使用webpack管理模块 因为在webpack看来,项目中的所有资源皆为模块,通过分析模块间的依赖关系,在其内部构建出一个依赖图,最终编…

地图数据导入

OpenStreetMap 地图数据官网 Geofabrik Download Server 下载数据 china-latest-free.shp.zip 解压到 D:\works\mapworks\shp\tmp 解压找到相关数据(目前我要的是铁路数据) 导入 gis_osm_railways_free_1.shp 到 pgAdmin4 数据库 1.启动 C:\Progra…

海外仓系统哪家好?闭坑指南,擦亮眼睛选对系统

可以说现在的海外仓系统市场还是比较杂乱的,各种不同类型,不同收费标准的系统比比皆是,这让很多想引进海外仓系统的企业不知所措,不知道怎么选。 今天就聊一下在选择海外仓系统的时候应该如何考量,才能避免被坑&#…

深度学习设计模式之组合模式

文章目录 前言一、介绍二、详细分析1.核心组成2.实现步骤3.代码示例4.优缺点优点缺点 5.使用场景 总结 前言 组合模式是将对象组合成树形结构来表现"整体/部分"层次结构,可以更好的实现管理操作。 一、介绍 组合设计模式又叫部分整体模式,将…

变分自编码器与传统编码器:比较、应用与发展历程

变分自编码器与传统编码器:比较、应用与发展历程传统自编码器(AE)基本原理应用发展起源 变分自编码器(VAE)基本原理应用发展起源 结论 变分自编码器与传统编码器:比较、应用与发展历程 在深度学习和机器学…

C++:vector的介绍及使用

✨✨✨学习的道路很枯燥,希望我们能并肩走下来! 文章目录 文章目录 前言 一、vector的介绍 二、vector的使用 2.1.构造和赋值重载(Member functions) 2.2 vector iterator 的使用 2.3 vector 空间增长问题 2.4 vector 增删查改 三 sort 四 v…

Kali : 安装Google Chrome 浏览器和ChromeDriver

目录 一、安装Google Chrome 浏览器 1、下载Google Chrome 2、安装Chrome 3、安装依赖包 二、安装ChromeDriver 1、查看Chrome版本 ​2、下载ChromeDriver 3、解压下载包 4、设置全局访问 5、赋予可执行权限 6、验证chromedriver 7、程序测试 一、安装Google Chrom…

STM32--ADC

一、简介 *ADC(Analog-Digital Converter)模拟-数字转换器 *ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁 *12位逐次逼近型ADC,1us转换时间 *输入电压范围:0~3.3V&…

# LLM高效微调详解-从Adpter、PrefixTuning到LoRA

一、背景 目前NLP主流范式是在大量通用数据上进行预训练语言模型训练,然后再针对特定下游任务进行微调,达到领域适应(迁移学习)的目的。 Context Learning v.s. SFT 指令微调是预训练语言模型微调的主流范式,其目的是…

爬虫学习1

爬虫网站:All products | Books to Scrape - Sandbox 豆瓣网:豆瓣电影 Top 250 我们需要安装一个第三方库来解析爬取到的html内容,终端输入pip install bs4,安装成功后引入需要的模块 我们先爬取所有的价格 import requests from bs4 import…

C# VSTO读取Excel单元格Value、Value2

对单个单元格的值,需要用object 对象去接 object value (object)oneCellRange.Value; object value2 (object)oneCellRange.Value2; 对矩形范围的值,需要用object[,]去接 object[,] matrixValues (object[,])matrixRange.Value; object[,] matrixV…

【全开源】民宿酒店预订管理系统(ThinkPHP+uniapp+uView)

民宿酒店预订管理系统 特色功能: 客户管理:该功能可以帮助民宿管理者更加有效地管理客户信息,包括客户的姓名、电话、地址、身份证号码等,并可以在客户的订单中了解客户的消费情况,从而更好地满足客户的需求&#xff…

【unity】(3) Terrain Editor

Terrain Editor 启动Terrain Editor 创建Terrain: 在Unity的Hierarchy视图中,右键选择 Create > 3D Object > Terrain 来创建一个新的Terrain对象。 打开Terrain Inspector: 选择Hierarchy中的Terrain对象,Inspector视图会显示Terrain的各种属性…

智能水抄表系统是什么?

1.概述:智能水抄表系统的概念与意义 智能水抄表系统是现代科技与水资源管理的完美结合,它利用先进的传感器技术、无线通信技术和数据分析能力,实现了远程、实时的水表读取和管理。这种系统不仅提高了抄表效率,降低了人力成本&…

Canny算子

Canny算子_百度百科 (baidu.com)https://baike.baidu.com/item/Canny%E7%AE%97%E5%AD%90/8821789?frge_ala 图像处理中最经典的边沿检测算法: Canny边缘检测_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1U4411277i/?spm_id_from333.1007.top_right_bar_…

【静态分析】在springboot使用太阿(Tai-e)02

参考:使用太阿(Tai-e)进行静态代码安全分析(spring-boot篇二) - 先知社区 本文章使用的被分析代码为GitHub - JoyChou93/java-sec-code: Java web common vulnerabilities and security code which is base on springb…

docxtemplater避坑!!! 前端导出word怎么插入本地图片或base64 有完整示例

用docxtemplater库实现前端通过模板导出word,遇到需求,要插图片并转成word并导出,在图片转换这块遇到了问题,网上查示例大多都跑不通,自己琢磨半天,总算搞明白了。 附上清晰完整示例,供参考。 …

医卫兰大药学试题及答案,分享几个实用搜题和学习工具 #媒体#微信

这些软件以其强大的搜索引擎和智能化的算法,为广大大学生提供了便捷、高效的解题方式。下面,让我们一起来了解几款备受大学生欢迎的搜题软件吧! 1.彩虹搜题 这个是公众号 题库内容丰富全面,细致分类整理。找题再也不费力&#…