算法学习笔记:169. 多数元素——摩尔投票算法(Moore‘s Voting Algorithm)

news/2025/3/4 6:33:30/

摩尔投票算法

摩尔投票算法最早由 Robert S. Boyer 和 J Strother Moore 在 1981 年的论文 “MJRTY—A Fast Majority Vote Algorithm” 中提出。这篇论文描述了摩尔投票算法的原理和证明,并展示了它在实际应用中的高效性。

论文的引用信息如下:

Title: MJRTY—A Fast Majority Vote Algorithm

Authors: Robert S. Boyer, J Strother Moore

Year: 1981 Published in: Automated

Reasoning: Essays in Honor of Woody Bledsoe

Publisher: Springer-Verlag

Pages: 105-117

算法思想

摩尔投票算法(Moore‘s Voting Algorithm)是一种用于在数组中寻找多数元素的有效方法。所谓的多数元素就是在数组中出现次数超过一半以上的元素。所以经常用于众数的查找。

摩尔投票算法的基本思想:是通过消除不同元素之间的对抗来找到可能的多数元素,所以算法遍历数组只需要维护两个变量,分别是候选元素和其对应的票数。开始时,候选元素为空,票数为0,然后对数组中的每个元素,执行以下步骤:

1.如果票数为0,将当前元素设为候选元素,并将票数设为1。

2.如果元素等于候选元素,则票数加1。

3.如果当前元素不等于候选元素,则票数减一。

这样做的原因是,相同元素的票数会相互抵消,不同元素的对抗也会导致票数减少。由于多数元素的条件是出现次数超过一半以上,所以最终留下的候选元素就很有可能是多数元素。

以下是摩尔投票的C++伪代码:

function findMajorityElement(nums):candidate = Nonecount = 0for num in nums:if count == 0:candidate = numif candidate == num:count += 1else:count -= 1# 进行第二次遍历,验证 candidate 是否为多数元素count = 0for num in nums:if num == candidate:count += 1if count > len(nums) / 2:return candidateelse:return None

摩尔投票算法的时间复杂度为O(n),空间复杂度为O(1),是一种高效的寻找多数元素的算法

题目概述

解题代码

C++解题代码如下:

class Solution {
public:int majorityElement(vector<int>& nums) {//多数元素是指在数组中出现大于n/2的次数int candidate, count = 0;for(auto num : nums) {if(count == 0) candidate = num;if(num == candidate) count++;else count--;}return candidate;}
};

Java解题代码如下:

 public static int majorityElement(int[] nums) {//多数元素是指在数组中出现大于n/2的次数int x = nums[0];int count = 0;for (int i = 0; i < nums.length; ++i) {if (count == 0) {x = nums[i];}if (nums[i] == x) {count++;} else {count--;}}return x;}

上述解题的时间复杂度为O(n)

 


http://www.ppmy.cn/news/1576478.html

相关文章

(七)消息队列-Kafka 序列化avro(传递)

&#xff08;七&#xff09;消息队列-Kafka 序列化avro&#xff08;传递&#xff09; 客从远方来&#xff0c;遗我双鲤鱼。呼儿烹鲤鱼&#xff0c;中有尺素书。 ——佚名《饮马长城窟行》 本文已同步CSDN、掘金平台、知乎等多个平台&#xff0c;图片依然保持最初发布的水印&…

基于 ‌MySQL 数据库‌对三级视图(用户视图、DBA视图、内部视图)的详细解释

基于 ‌MySQL 数据库‌对三级视图&#xff08;用户视图、DBA视图、内部视图&#xff09;的详细解释&#xff0c;结合理论与实际操作说明&#xff1a; 一、三级视图核心概念 数据库的三级视图是 ANSI/SPARC 体系结构的核心思想&#xff0c;MySQL 的实现逻辑如下&#xff1a; …

0301 leetcode - 1502.判断是否能形成等差数列、 682.棒球比赛、657.机器人能否返回原点

1502.判断是否能形成等差数列 题目 给你一个数字数组 arr 。 如果一个数列中&#xff0c;任意相邻两项的差总等于同一个常数&#xff0c;那么这个数列就称为 等差数列 。 如果可以重新排列数组形成等差数列&#xff0c;请返回 true &#xff1b;否则&#xff0c;返回 false…

Spring Boot 使用过滤器filter

执行流程 在Spring Boot项目中&#xff0c;过滤器&#xff08;Filter&#xff09;的执行流程遵循Servlet规范。具体来说&#xff0c;过滤器是在请求到达目标资源之前和响应返回给客户端之前执行的一系列操作。下面是详细的过滤器执行流程&#xff1a; 初始化阶段: 当Web应用启…

SQL Server2019安装步骤+使用+解决部分报错+卸载(超详细 附下载链接)

1、下载安装SQL Server2019 第一步&#xff1a;官网下载安装包SQL Server 2019 - 定价 | Microsoft 【以下内容图片借用SQL Server2019安装步骤&#xff08;超详细 附下载链接&#xff09; - 掘金中内容】 第二步&#xff1a;打开安装包&#xff0c;并选择基本. 第三步&#…

三次握手内部实现原理

socket()创建一个新的套接字 int socket(int domain, int type, int protocol)&#xff1b; 参数&#xff1a; domain&#xff1a;地址族&#xff0c;如 AF_INET&#xff08;IPv4&#xff09;&#xff0c;AF_INET6&#xff08;IPv6&#xff09; type&#xff1a;套接字类型&…

【CSS—前端快速入门】CSS 常用样式

CSS 常用 CSS 样式 1. 前端样式查询网站&#xff1a; MDN Web Docs (mozilla.org) w3school 2. border 2.1 借助 MDN 了解 border 我们借助 MDN 网站来学习 border 样式的使用&#xff1a; 2.2 border 常见属性 保存代码&#xff0c;打开页面&#xff1a; 对于标签不同样式的…

内网渗透测试-Vulnerable Docker靶场

靶场来源&#xff1a; Vulnerable Docker: 1 ~ VulnHub 描述&#xff1a;Down By The Docker 有没有想过在容器中玩 docker 错误配置、权限提升等&#xff1f; 下载此 VM&#xff0c;拿出您的渗透测试帽并开始使用 我们有 2 种模式&#xff1a; - HARD&#xff1a;这需要您将 d…