[leetcode刷题]面试经典150题之5多数元素元素(简单)【附Boyer-Moore 投票算法(摩尔投票法)】

server/2024/11/15 2:12:07/

很有意思的一个题,想了半天没想出来,最后发现两行代码就做出来了。写完后学习到还可以用Boyer-Moore 投票算法,能减小空间复杂度,我把它写在后面,可以进一步学习。

题目  多数元素

给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

解决思路

这个题的重点是多数元素大于总元素的n/2,也就是说这个数组中超过一半的数都是这个数。那么我们可以将元素排序,无论n为奇还是偶,int(n/2)的位置一定是这个多数元素。

代码

class Solution:def majorityElement(self, nums: List[int]) -> int:nums.sort()return nums[int(len(nums)/2)]

Boyer-Moore 投票算法详解

Boyer-Moore 投票算法是一种用于寻找多数元素的经典算法。它可以在 O(n) 的时间复杂度和 O(1) 的空间复杂度下找到数组中的多数元素。

多数元素定义:

多数元素是指在一个长度为 n 的数组中,出现次数超过 n/2 的元素。例如,在数组 [3, 3, 4, 2, 3, 3, 3] 中,元素 3 是多数元素,因为它出现了 5 次,超过了数组长度的一半(7 / 2 = 3.5)。

算法思路:

Boyer-Moore 投票算法基于一个简单但有效的贪心思想:通过配对和抵消的方式找到多数元素。具体过程如下:

  1. 假设:我们假设数组中确实存在一个多数元素,它的出现次数大于 n/2
  2. 配对与抵消
    • 初始化一个候选元素,并设置它的计数器为 1。
    • 遍历数组,当遇到与当前候选元素相同的元素时,增加计数器;当遇到不同的元素时,减少计数器。
    • 如果计数器为 0,意味着当前候选元素的力量被完全抵消掉了,我们选择当前的元素作为新的候选元素,并将计数器重置为 1。
  3. 最终结果:遍历结束后,剩下的候选元素就是多数元素。
代码
class Solution:def majorityElement(self, nums: List[int]) -> int:candidate = None  # 初始化候选元素count = 0  # 计数器# 第一遍遍历找出候选元素for num in nums:if count == 0:  # 如果计数为0,更新候选元素candidate = numcount += (1 if num == candidate else -1)  # 相同则+1,不同则-1# 返回最终的候选元素return candidate

学习这个算法的时候我有想会不会有有特殊情况使多数元素最后结果也是0,例如多数元素没隔一个出现一次的情况会什么样?会不会就不行了。答案是并不会,例如数组 [1, 3, 1, 3, 1, 3, 1],也可以通过 Boyer-Moore 投票算法找到多数元素。我们来看看这个过程如何进行。

nums = [1, 3, 1, 3, 1, 3, 1]
  1. 初始化 candidate = Nonecount = 0
  2. 遍历 nums
    • 第一个元素 1count == 0,所以 candidate = 1count = 1
    • 第二个元素 3,不同于 candidate,所以 count = 0
    • 第三个元素 1count == 0candidate = 1count = 1
    • 第四个元素 3,不同于 candidatecount = 0
    • 第五个元素 1count == 0candidate = 1count = 1
    • 第六个元素 3,不同于 candidatecount = 0
    • 第七个元素 1count == 0candidate = 1count = 1

最终 candidate1,正确找到了多数元素。

结论

  • 无论多数元素如何分布(连续或分散),只要它出现的次数超过 n/2,它就能在最后通过不断抵消其他元素最终胜出。
  • Boyer-Moore 投票算法依赖于这个“多数”特性,只要有超过半数的元素在数组中,它们的力量在与其他元素进行抵消时最终会保留下来。


http://www.ppmy.cn/server/119703.html

相关文章

OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【内核通信机制】下

往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~ 子系统开发内核 轻量系统内核(LiteOS-M) 轻量系统内核&#…

局域网共享文件夹:您没有权限访问,请与网络管理员联系

局域网共享文件夹:您没有权限访问,请与网络管理员联系 win10 1909 专业版背景 我有两个电脑,还有两块外挂硬盘,较大的一块放在老电脑上,为了方便用垃圾百度网盘在里边下载东西,又不污染新电脑的环境。 如…

PowerBI-l7-如何为Power BI报表设计动画背景

需求: 经常会看到别人家的报告上面的动态的背景很漂亮 这是怎么做到的呢? 操作 插入图片的时候直接选用为GIF的动态图片即可

【蜡笔小新专享】安装虚拟机、PHP、DVWA

在 VMware 中安装 PHP 和 DVWA 需要几个步骤。这里将详细介绍如何在一个 Linux 虚拟机中安装 DVWA 和 PHP 环境,以便进行 Web 安全测试。假设你已经在 VMware 上安装好了一个 Linux 发行版(如 Ubuntu)。 步骤 1:安装 VMware 和创…

Track 09:X-XMCL

边缘计算(Edge Computing)是一种分布式计算架构,其将数据处理任务从传统的数据中心或云端转移到数据生成的地点——即网络的“边缘”。这种计算模型旨在缩短数据传输的距离,从而降低延迟、减轻带宽负担、提高数据处理速度,并增强隐私保护和安全性。以下是关于边缘计算的详…

Python用TOPSIS熵权法重构粮食系统及期刊指标权重多属性决策MCDM研究|附数据代码...

原文链接:https://tecdat.cn/?p37724 在当今世界,粮食系统的稳定性至关重要。尽管现有的全球粮食系统在生产和分配方面表现出较高的效率,但仍存在大量人口遭受饥饿以及诸多粮食安全隐患。与此同时,在学术领域,准确评估…

项目文件配置

1. 参数配置化 1.1 问题分析 1.2 问题解决 Value 注解通常用于外部配置的属性注入,具体用法为:Value("${配置文件中的key}") 2. yml配置文件 2.1 SpringBoot提供了多种属性配置方式 2.2 常见配置文件格式对比 2.3 yml 基本语法 大小写敏…

分类预测|基于改进的灰狼IGWO优化支持向量机SVM的数据分类预测matlab程序 改进策略:Cat混沌与高斯变异

分类预测|基于改进的灰狼IGWO优化支持向量机SVM的数据分类预测matlab程序 改进策略:Cat混沌与高斯变异 文章目录 一、基本原理原理流程1. **定义目标函数**2. **初始化GWO**3. **评估适应度**4. **更新狼的位置**5. **更新狼的等级**6. **重复迭代**7. **选择最佳解…