当前位置: 首页 > news >正文

leetcode169. 多数元素,摩尔投票法附证明

leetcode169. 多数元素

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

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

示例 1:
输入:nums = [3,2,3]
输出:3

示例 2:
输入:nums = [2,2,1,1,1,2,2]
输出:2

目录

    • leetcode169. 多数元素
    • 题目分析
    • 算法介绍
      • 算法证明
        • 推论一
        • 推论二
    • 算法步骤
      • 候选者选择
    • 流程图
    • 具体代码
    • 算法分析
    • 相似题目

题目分析

这道题目要求我们在一个整数数组中找到众数,即出现次数超过数组长度一半的元素。题目保证这样的元素必定存在。

注意,此题中的众数指的是在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

算法介绍

这里使用的是摩尔投票算法(Boyer-Moore Voting Algorithm)。这个算法的核心思想是通过相互抵消的方式,找到数组中出现次数超过一半的元素。
候选者选择:遍历数组,维护一个候选元素candidate和计数器count。当count为0时,将当前元素设为candidate,并将count置为1。如果遇到相同的元素,则增加count;如果遇到不同的元素,则减少count

算法证明

推论一

假设数组中存在一个众数majority,其出现次数为m,数组长度为n。由于majority是众数,所以m > n/2

  • 对于每个非众数元素,我们将其票数记为-1。
  • 对于每个众数元素,我们将其票数记为+1。

由于majority出现的次数超过一半,所以所有数字的票数和sum必定大于0。

推论二

假设数组的前a个数字的票数和为0,即所有非众数元素已经被抵消。

  • 由于众数majority出现m次,其中m > n/2,所以剩余的n-a个数字中,至少还剩下m-a个众数元素。
  • 因此,剩余数字的票数和仍然大于0,即后n-a个数字的众数仍为majority

算法步骤

候选者选择

  1. 遍历数组:逐个检查数组中的每个元素。
  2. 维护候选元素和计数器:使用candidate存储当前可能的众数,count记录其出现次数。
  3. 抵消不同元素:当遇到与candidate相同的元素时,增加count;当遇到不同的元素时,减少count。当count变为0时,更换candidate

流程图

在这里插入图片描述

具体代码

class Solution {
public:int majorityElement(vector<int>& nums) {int candidate = -1;int count = 0;for (int num : nums) {if (num == candidate)++count;else if (--count < 0) {candidate = num;count = 1;}}return candidate;}
};

算法分析

  • 时间复杂度:O(n),其中n是数组的长度。算法只需要遍历数组两次。
  • 空间复杂度:O(1),算法只需要常数级别的额外空间。
  • 易错点:在维护candidatecount时,需要注意逻辑的准确性,特别是在count为0时更换candidate
  • 注意点:题目已经保证众数存在,这是使用摩尔投票算法的前提。

相似题目

题目链接
求众数 II在一个整数数组中找到所有出现次数超过 ⌊ n/3 ⌋ 次的元素。
检查一个数是否在数组中占绝大多数判断一个数在一个排序数组中是否出现次数超过一半。

相关文章:

leetcode169. 多数元素,摩尔投票法附证明

leetcode169. 多数元素 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 示例 1&#xff1a; 输入&#xff1a;nums [3,2,3] 输…...

Pixel Adventure Unity2D开发完整指南

本文参考&#xff1a;2-2. Get and Setup Assets_哔哩哔哩_bilibili 1、下载资源 在Asset Store中下载Pix Adventure1 2的资源&#xff1a; 在import的时候&#xff0c;不用到Scene import进来&#xff0c;如下图所示&#xff0c;Scenes目录反勾选一下。 两个资源都下载完成后…...

signed main()与int main()的区别

刷算法题时为了防止爆int ,通常会开long long #define int long long 但这样int main()会出现问题,main函数的返回值必须是signed或int,由于定义int 为long long 我们只能让返回值变为signed main() #include<bits/stdc.h> using namespace std; #define int long lo…...

【面试宝典】Java基础 这个面试题整理的不全 后期会进行补充

一、equals 和 hashcode 1、简述 hashCode() 和 equals(Object obj) 的作用及其关系 hashCode() 方法用于获取对象的哈希码&#xff0c;即一个整数。这个哈希码在基于哈希的集合&#xff08;如HashSet、HashMap等&#xff09;中用于确定对象的存储位置。 equals(Object obj)…...

获取语音文件时长

获取语音文件时长一会儿有一会儿没的&#xff0c;百思不得其解。 错误代码&#xff1a; const getAudioDuration async src > {const audio new Audio(src);const duration await new Promise(resolve > {if (audio.duration) {return resolve(parseInt(audio.duratio…...

应急响应计划:网络安全事件后的快速恢复策略

在数字化时代&#xff0c;网络安全威胁日益严峻&#xff0c;任何企业都无法完全避免遭受网络攻击或数据泄露的风险。因此&#xff0c;制定一套完善的应急响应计划&#xff0c;以便在网络安全事件发生后能够迅速、有效地进行应对和恢复&#xff0c;成为企业保障业务连续性、保护…...

【网络】IP和MAC地址的映射——ARP协议和ARP欺骗概述

目录 引言 ARP的工作机制 ARP欺骗 ARP欺骗的断网行为 ARP欺骗成为中间人 工具介绍 个人主页&#xff1a;东洛的克莱斯韦克-CSDN博客 引言 同一子网内不同主机用数据链路层的MAC地址来寻址&#xff0c;而不是子网内的私有IP&#xff08;网络层&#xff09;。数据包中的IP…...

鸿蒙(API 12 Beta3版)【音视频解封装】 文件解析封装

开发者可以调用本模块的Native API接口&#xff0c;完成音视频解封装&#xff0c;即从比特流数据中取出音频、视频等媒体帧数据。 当前支持的数据输入类型有&#xff1a;远程连接(http协议、HLS协议)和文件描述符(fd)。 支持的解封装格式如下&#xff1a; 媒体格式封装格式码…...

智能马桶盖和普通马桶盖有什么不同?

智能马桶盖与普通马桶盖之间存在显著的差异&#xff0c;主要体现在以下几个方面&#xff1a; 一、功能差异 1.清洗功能&#xff1a; 智能马桶盖&#xff1a;配备了清洗功能&#xff0c;包括臀洗、妇洗等&#xff0c;特别针对女性设计了贴心功能&#xff0c;如移动喷水、水流按…...

C# OnnxRuntime部署LivePortrait实现快速、高质量的人像驱动视频生成

目录 效果 说明 项目 模型信息 代码 下载 效果 LivePortrait实现快速、高质量的人像驱动视频生成 说明 官网地址&#xff1a;https://github.com/KwaiVGI/LivePortrait 代码实现参考&#xff1a;https://github.com/hpc203/liveportrait-onnxrun 模型下载&#xff1a;…...

Spring boot框架指南

1. Spring Boot 概述 1.1 定义与起源 Spring Boot是一种基于Spring框架的开源框架&#xff0c;旨在简化Spring应用程序的创建和开发过程。它通过提供一系列默认配置和自动配置功能&#xff0c;减少了开发者在配置上的工作量&#xff0c;使得快速搭建生产级别的Spring应用程序…...

数据结构--树与二叉树

数据结构分类 集合 线性结构(一对一) 树形结构(一对多) 图结构(多对多) 数据结构三要素 1、逻辑结构 2、数据的运算 3、存储结构&#xff08;物理结构&#xff09; 树的概念 树的分类 满二叉树和完全二叉树 二叉排序树 平衡二叉树 二叉树分类总结 二叉树的存储结构 …...

C#项目实战经验——计时方法总结

前言 我们在开发C#程序的过程中经常需要计算某段程序执行的时间&#xff0c;比如调用的某个算法的时间&#xff0c;这时候我们就需要利用计时工具&#xff0c;本文就是详细介绍在C#中我们常用哪些计时工具。 1、计时方法—StopWatch 在C#中我们可以利用Stopwatch这个类来实现…...

电子盖章软件哪个好|盖章软件

在选择电子盖章软件时&#xff0c;需要考虑多个因素&#xff0c;包括软件的功能、安全性、易用性、兼容性以及成本等。以下是根据当前市场情况推荐的一些优秀的电子盖章软件&#xff1a; e章宝&#xff1a; 功能丰富&#xff1a;e章宝是国内领先的电子盖章系统&#xff0c;功能…...

ThreejsWebGPU运动残影demo

功能点 实例化SkinnedMesh 修改NodeMaterial着色器 节点材质系统 shader 语言 使用uniform和attribute 中合其他几篇博客中的内容 代码仓库 克隆后需要放到three源码同级别目录下 运行 three源码部分不在git仓库中(太大了) 使用vscode的live-server启动后访问 http://127.0.0.…...

HttpSession常用方法

1.HttpSession常用方法 是在Java Servlet中用来管理会话状态的重要接口&#xff0c;它提供了一种在多个请求或页面之间存储用户特定信息的方式。以下是一些 HttpSession 常用的方法和用法&#xff1a; 获取会话对象&#xff1a; HttpSession session request.getSession();…...

【JavaEE初阶】文件操作和IO

目录 &#x1f334;认识文件 &#x1f6a9;树型结构组织和目录 &#x1f6a9;文件路径&#xff08;Path&#xff09; &#x1f6a9; 文件分类 &#x1f38d;Java 中操作文件 &#x1f6a9; File 概述&#xff1a; &#x1f4cc;属性 &#x1f4cc;构造方法 &#x1f4c…...

存储器芯片的基本原理

目录 1.存储元 1.1栅极电容 1.2双稳态触发器 2.存储单元 3.存储体 4.存储器 5.容量计算 6.寻址 1.存储元 1.1栅极电容 给MOS管一个阈值电压&#xff08;5v&#xff09;就能够导电&#xff0c;若是不给那么就是一个绝缘体不会导电。 读出二进制原理&#xff1a; 通常…...

前端实习手记(7):立秋快乐

这周相比上周感觉挺好的哈哈哈&#xff0c;可能只有自己感觉蛮好的&#xff0c;旁边师父忙的飞起了要&#xff0c;不仅赶工作还要回答我乱七八糟的问题&#xff08;心疼一秒&#xff09;。这周也是立秋&七夕咯&#xff0c;立秋快乐哇家人们&#xff08;虽然还是很热嘛&…...

感恩放下,笑对人生,在人生的长河中,每一天都是独特的篇章,或顺心如意,或充满挑战

在人生的长河中,每一天都是独特的篇章,或顺心如意,或充满挑战。然而,无论今日的经历如何,我们都应怀着感恩与放下的心态,因为人生的旅程远不止这短暂的一天,明天依然充满希望,等待我们继续努力前行。 生活,犹如一场变幻莫测的舞台剧,顺心之时,我们仿佛置身于温暖的…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...