摩尔投票法

news/2025/9/22 16:31:02/文章来源:https://www.cnblogs.com/qinLiCode/p/19105489

0、参考资料(讲解视频及博客等)

  • 本人水平有限,如有错误,恳请指正
  • 讲解视频:【【算法】摩尔投票法】

一、应用场景

  • 典型应用场景:在一个数组中,寻找出现次数超过总元素数一半的元素(即 “主元素”);也可扩展到寻找出现次数超过 kn​ 的元素(需结合多候选抵消逻辑)。
  • 场景特点:数组规模大,要求时间复杂度尽可能低(线性时间)、空间复杂度尽可能小(常数空间),避免额外存储大量计数信息。

二、核心思想 / 步骤

摩尔投票法的核心是 “计数抵消”:利用 “多数元素的数量优势”,让不同元素相互抵消,最终筛选出候选元素,再通过验证确认是否为目标。
分为两个核心阶段:

  1. 候选元素筛选
    • 初始化:选数组第一个元素为候选元素,计数 count = 1(表示候选的 “剩余优势次数”)。
    • 遍历数组后续元素:
      • 若当前元素与候选元素相同:count++(强化候选的 “数量优势”)。
      • 若当前元素与候选元素不同:
        • 若 count > 0count--(用候选的 “优势次数” 抵消当前不同元素)。
        • 若 count == 0:更换候选元素为当前元素,重置 count = 1(原候选已被完全抵消,新候选重新积累优势)。
  2. 候选元素验证
    • 遍历结束后,候选元素是 “可能的多数元素”,但需再次遍历数组,统计其实际出现次数。
    • 若实际次数超过总元素数的一半,则确认为主元素;否则说明不存在主元素(避免抵消过程中的误判)。

三、代码模板与测试

代码模板 (C 语言为例)

int majorityElement(int* nums, int numsSize) {int candidate = nums[0]; // 初始化候选元素int count = 1;           // 候选元素的计数// 阶段1:筛选候选元素for (int i = 1; i < numsSize; i++) {if (nums[i] == candidate) {//为候选人得票count++;} else {//竞争对手if (count > 0) {count--;//冲突抵消} else {//cnt = 0,更换候选人candidate = nums[i];count = 1;}}}// 阶段2:验证候选元素(若题目确保存在主元素,可省略此阶段)int verifyCount = 0;for (int i = 0; i < numsSize; i++) {if (nums[i] == candidate) {verifyCount++;}}return (verifyCount > numsSize / 2) ? candidate : -1; // 存在返回候选,否则返回-1
}

样例

寻找数组中的主元素(出现次数超过一半的元素)
输入nums = {0, 5, 5, 3, 5, 7, 5, 5}(长度为 8,5 出现 5 次,超过 8/2=4 次)
输出5

#include <stdio.h>int majorityElement(int* nums, int numsSize) {int candidate = nums[0];int count = 1;for (int i = 1; i < numsSize; i++) {if (nums[i] == candidate) count++;else {if (count > 0) count--;else {candidate = nums[i];count = 1;}}}int verify = 0;for (int i = 0; i < numsSize; i++) if (nums[i] == candidate) verify++;return verify > numsSize / 2 ? candidate : -1;
}int main() {int nums[] = {0, 5, 5, 3, 5, 7, 5, 5};int size = sizeof(nums) / sizeof(nums[0]);int result = majorityElement(nums, size);printf("主元素:%d\n", result); // 输出:5return 0;
}

四、优化与同类算法对比

优化方案

  • 题目明确保证存在主元素(如 LeetCode 169 题),可直接省略 “验证阶段”,遍历一次即可返回候选元素,此时时间复杂度为 O(n),空间复杂度为 O(1)(最优)。
  • 扩展场景(找出现次数超过 kn​ 的元素):需维护 k−1 个候选及对应计数,逻辑类似 “多候选相互抵消”,最终再验证每个候选的实际次数。

算法对比 / 复杂度分析

算法 时间复杂度 空间复杂度 适用场景 优缺点
摩尔投票法 O(n) O(1) 找 “超半数” 或 “超 kn​” 元素 时间、空间最优;但仅适用于 “数量优势类” 问题,通用性弱。
哈希表计数 O(n) O(n) 任意频率统计 通用但空间开销大,哈希表存储所有元素的计数。
排序后取中间 O(nlogn) O(1)(原地排序) 仅适用于 “超半数” 场景(排序后中间元素必为目标) 时间开销高(排序),但无需额外验证。

五、相关 LeetCode 题目推荐

  • LeetCode 169. 多数元素(基础应用,保证存在主元素)
  • LeetCode 229. 多数元素 II(扩展应用,找出现次数超过 3n​ 的元素)
  • LeetCode 面试题 17.10. 主要元素(需验证主元素是否存在)
  • 408统考2013年真题

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

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

相关文章

基于STM32平台的ADS1292心电采集驱动程序

一、硬件连接方案 graph LRA[STM32F103] -->|SPI1| B[ADS1292]A -->|GPIO| BB -->|DRDY| C[STM32 EXTI]subgraph STM32SPI1_SCK --> GPIOA5SPI1_MISO --> GPIOA6SPI1_MOSI --> GPIOA7SPI1_CS -->…

C#开发的等待界面类库例子 - 开源研究系列文章

C#开发的等待界面类库例子 - 开源研究系列文章Posted on 2025-09-22 16:30 lzhdim 阅读(0) 评论(0) 收藏 举报 今天讲讲应用里的等待窗体的例子。在实际的使用中,有时候如果应用需要长时间的运行某个函数或…

青秀网站建设wordpress 无广告视频

创&#xff1a;18_3_2017修&#xff1a;20_3_2017 什么是前端&#xff1f;  --在浏览器中展示内容以及处理请求 什么是浏览器&#xff1f;   --一款能将网页内容展现给用户查看&#xff0c;并且让用户与网页交互的软件 什么是内核&#xff1f;   --渲染引擎&#xff0c;规…

搜索引擎有哪些网站沈阳网站建设本地化技术服务

二叉树 打算先来了解二叉树基础&#xff0c;都是简单题&#xff0c;目的是熟悉代码格式和解题基础思路。 1、二叉树最大深度 二叉树最大深度 方法一、深度搜索 直接用原函数做递归&#xff0c;比较简单 /*** Definition for a binary tree node.* struct TreeNode {* …

网站前台的网址公众号怎么开通商城

绕孔轴旋转的可无限旋转枪头以及送丝机是ETR堆焊系统的核心在传动米亏的帮助下&#xff0c;焊接电流、保护气、焊枪冷却专职和电气控制信号进行着不间断的工作。然而&#xff0c;如同所有复杂设备&#xff0c;该系统在使用过程中也可能遇到故障。因此&#xff0c;建议与子锐机器…

世界网站制作网站建设找金手指排名

对于ftp工具&#xff0c;你了解多少&#xff1f;其实一般人也接触不到这种软件。ftp工具主要是针对从事网站管理的工作人员比较有利的一款工具。可以帮助他们快速的解决工作中的问题。方便、简单、快捷又明了的解决问题。那ftp工具有哪些呢&#xff1f;接下来给大家推荐四款好用…

简述建设电子商务网站步骤写软文怎么接单子

目录 今日良言&#xff1a;关关难过关关过&#xff0c;步步难行步步行 一、单例模式 1.饿汉模式 2.懒汉模式 二、工厂模式 今日良言&#xff1a;关关难过关关过&#xff0c;步步难行步步行 一、单例模式 首先来解释一下&#xff0c;什么是单例模式。 单例模式也就是单个…

搭建自己的博客网站做网站推广书范法吗

思路&#xff1a;将以桥为分界的所有连通分支进行缩点&#xff0c;得到一颗树&#xff0c;求出树的直径。再用树上的点减去直径&#xff0c;再减一 #pragma comment(linker, "/STACK:1024000000,1024000000") #include<iostream> #include<cstdio> #incl…

学校微网站模板工信部网站黑名单

总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍机器学习中图像文本检索技术。此技术把自然语言处理和图像处理进行了融合。 参考 2024年&#xff08;第12届&#xff09;“泰迪杯”数据挖掘挑战赛 图像特征提取&#xff08;VGG和Resnet特征提取卷积过程详解&…

番禺网站建设公司有哪些天津网约车

本文通过一个例子来介绍利用maven来构建一个多模块的jave项目。开发工具&#xff1a;intellij idea。 一、项目结构 multi-module-project是主工程&#xff0c;里面包含两个模块&#xff08;Module&#xff09;&#xff1a; web-app是应用层&#xff0c;用于界面展示&#xff…

承德建设企业网站国外著名的网站设计公司

Spring Boot 是由 Pivotal 团队提供的全新框架&#xff0c;其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。我这里会分享一些学习Spring Boot的方法和干货&#xff0c;包括…

网站建设的快乐学编程的好处

随着信息技术与制造业的深度协调&#xff0c;作为企业发展的趋势&#xff0c;大中型制造企业需要拥抱信息化建设。通过运用信息技术和数字化运营&#xff0c;大中型制造企业的生产、设计、经营、管理、后续服务等都实现自动化、智能化。大中型制造企业信息化建设解决方案&#…

ProcessPoolExecutor VS ThreadPoolExecutor 进程池对比线程池

ProcessPoolExecutor VS ThreadPoolExecutor 进程池对比线程池 示例一: I/O 场景——10 个网页并发下载 + 实时进度 结果 多线程: 100%|██████████| 10/10 [00:07<00:00, 1.41it/s] 【多线程】I/O 并发…

深入解析MS12-020关键漏洞CVE-2012-0002:远程桌面协议的安全风险与缓解方案

本文详细分析了微软远程桌面协议(RDP)中的高危漏洞CVE-2012-0002,该漏洞允许未经认证的远程代码执行,影响所有Windows版本。文章提供了启用网络级认证(NLA)的临时缓解方案,并讨论了终端服务网关和RemoteFX场景的风险…

模板网站可以自己买空间吗吗企业官网策划

2022年第十一届数学建模国际赛小美赛 D题 野生动物贸易是否应长期禁止 原题再现&#xff1a; 野生动物市场被怀疑是此次疫情和2002年SARS疫情的源头&#xff0c;食用野生肉类被认为是非洲埃博拉病毒的一个来源。在冠状病毒爆发后&#xff0c;中国最高立法机构永久性地加强了野…

课程网站建设方案提高seo排名

随着金九银十逐渐进入尾声&#xff0c;还在观望机会的朋友们已经开始焦躁&#xff1a;“为什么我投的简历还没有回音&#xff1f;要不要趁现在裸辞好好找工作&#xff1f;” “金九银十”作为人们常说的传统“升职加薪”的黄金季节&#xff0c;也是许多人跳槽的理想时机。然而…

电商网站规划论文快速搭建网站前端

UISlide 的不同效果展现&#xff1a;运行代码 本文转自懒得安分博客园博客&#xff0c;原文链接&#xff1a;XXXXXXXX&#xff0c;如需转载请自行联系原作者

高端定制网站开发设计建站流程登封市城乡建设路网站

1 简介 1.1 横向联邦学习 横向联邦学习也称为按样本划分的联邦学习&#xff0c;主要应用于各个参与方的数据集有相同的特征空间和不同的样本空间的场景&#xff0c;例如两个地区的城市商业银行可能在各自的地区拥有非常不同的客户群体&#xff0c;所以他们的客户交集非常小&a…

网站老域名跳转到新域名阿里巴巴招聘官网

上一讲主要介绍了看板方法以及如何使用看板方法来解决软件研发过程中出现的团队过载、工作不均、任务延期等问题。通过学习前面几个课时介绍的知识&#xff0c;你的团队开始源源不断地交付用户价值。用户对交付的功能非常满意&#xff0c;但等到系统上线后经常出现服务不可用的…

美食网站 原型 html 下载网站咨询弹窗是怎么做的

前言: 爬虫哪家强,当然是python 我是属于啥语言都用,都懂点,不精通,实际工作中能能够顶上就可以。去年写的抓取bing每日的壁纸&#xff0c;保存到本地&#xff0c;并上传到阿里云oss&#xff0c;如果只是本地壁纸切换&#xff0c;存下来就行&#xff0c;一直想做个壁纸站点&…