【面试经典150 | 数组】多数元素

news2024/11/29 2:44:25

文章目录

  • 写在前面
  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:哈希表
    • 方法二:排序
    • 方法三:摩尔投票法
  • 写在最后

写在前面

本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更……

专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下,部分内容会有增删:

  • Tag:介绍本题牵涉到的知识点、数据结构;
  • 题目来源:贴上题目的链接,方便大家查找题目并完成练习;
  • 题目解读:复述题目(确保自己真的理解题目意思),并强调一些题目重点信息;
  • 解题思路:介绍一些解题思路,每种解题思路包括思路讲解、实现代码以及复杂度分析;
  • 知识回忆:针对今天介绍的题目中的重点内容、数据结构进行回顾总结。

Tag

【多数投票法】【哈希表】【数组】


题目来源

面试经典 150 题 —— 169. 多数元素


题目解读

给定一个数组 nums,返回数组中的多数元素,多数元素指的是出现次数大于 ⌊ n / 2 ⌋ \lfloor{n/2}\rfloor n/2 的元素。数组 nums 非空并且一定存在多数元素。


解题思路

方法一:哈希表

多数元素出现的次数大于 ⌊ n / 2 ⌋ \lfloor{n/2}\rfloor n/2,该多数元素一定是数组中出现次数最多的元素,因此可以想到利用哈希表记录每个元素出现的次数,返回出现次数最多的元素即可。

在具体实现中,可以一边更新哈希表,一边更新当前出现次数最大的数,这样可以省去一次遍历操作。

实现代码

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int res = 0, cnt = 0;
        unordered_map<int, int> cnts;
        for (int num : nums) {
            ++cnts[num];
            if (cnts[num] > cnt) {
                res = num;
                cnt = cnts[num];
            }
        }
        return res;
    }
};

复杂度分析

时间复杂度: O ( n ) O(n) O(n) n n n 为数组 nums 的长度。

空间复杂度: O ( n ) O(n) O(n),使用一个哈希表存放数组 nums 中元素出现的个数。

方法二:排序

首先对数组 nums 进行排序,升序或者降序都可以,下标为 ⌊ n / 2 ⌋ \lfloor{n/2}\rfloor n/2 元素一定就是多数元素。

实现代码

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        return nums[nums.size() / 2];
    }
};

复杂度分析

时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn) n n n 为数组 nums 的长度。

空间复杂度: O ( n l o g n ) O(nlogn) O(nlogn),求多数元素没有使用额外的空间,这个额外的空间是排序算法占用的时间。

方法三:摩尔投票法

现在来介绍一种时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( 1 ) O(1) O(1) 的解法。

博耶-摩尔多数投票算法,也称作 多数投票算法摩尔投票算法。这一算法由罗伯特·S·博耶和J·斯特罗瑟·摩尔在1981年发表,也是处理数据流的一种典型算法。

多数投票算法解决的问题是:如何在众多候选人中,选出得票最多的那一个,和本题需要解决的问题一致。

在投票问题中,如果当前的唱票结果和上一次的结果一致,则得票的候选人票数 +1;否则,将上一个得票的候选人票数 -1,并判断,如果此时的票数 < 0,则当前得票的候选人会取代上一个候选人成为新的候选人,其得票数置为 1

于是在本题中,维护一个 majority 表示众数,一个 cnt 表示当前众数的数量,遍历数组 nums,设当前数字为 num

  • 如果 num = majority,则 ++cnt
  • 否则,先 --cnt,如果 cnt < 0,则 majority = num 并且 cnt = 1
  • 上一步中的先 -- 再判断,可以用一步实现 --cnt < 0

最后返回 majority 就是题目中要求的多数元素。

实现代码

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

复杂度分析

时间复杂度: O ( n ) O(n) O(n) n n n 为数组 nums 的长度,因为只需要一次遍历就能解决该问题。

空间复杂度: O ( 1 ) O(1) O(1),仅使用了有限个变量。


写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。

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

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

相关文章

HelpLook全新升级!定制AI问答机器人,企业内容中心焕新

一直以来&#xff0c;企业都在努力解决内外部“企业知识管理”问题&#xff1a;从纸质手册发放&#xff0c;转线上电子文档传阅(pdf/ppt/word等)&#xff0c;再到整理客户常见问题(FAQ)和内部知识库(wiki)&#xff0c;但始终没有找到一套完整方案将“企业知识”很好地集中管理及…

不得不爱的AI艺术写真头像二维码生成小程序开发

最近什么最火&#xff1f;AI最火&#xff01; AI里什么最火&#xff1f;艺术写真生成和二维码美化最火。 一款小程序集合了高还原度的AI写真艺术照和二维码美化&#xff0c;你们说香还是不香&#xff1f; 并且加入了输入心愿就能生成独一无二的个性头像功能&#xff0c;直接…

zabbix自定义监控内容案例

一、自定义监控内容 案列&#xff1a;自定义监控客户端服务器登录的人数需求&#xff1a;限制登录人数不超过 3 个&#xff0c;超过 3 个就发出报警信息 1、在客户端创建自定义key 明确需要执行的linux命令 创建zabbix监控项配置文件&#xff0c;用于自定义Key #在zabbix的…

vmware创建的虚拟机无法连接外网

在我本机中使用vmware创建虚拟机后&#xff0c;安装 docker 时使用wget 命令下载docker的安装文件 报错找不到资源&#xff0c;然后通过ping www.baidu.com 发现也ping不通&#xff0c;经过一番折腾可以访问外网了&#xff0c;将步骤记录下来&#xff1b; 1、设置虚拟机的网络…

【Python小项目之Tkinter应用】随机点名/抽奖工具大优化:新增查看历史记录窗口!语音播报功能!修复预览文件按钮等之前版本的bug!

文章目录 前言一、实现思路二、关键代码查看历史记录按钮语音播报按钮三、完整代码总结前言 老生常谈,先看效果:(订阅专栏可获取完整代码) 初始状态下,我们为除了【设置】外的按钮添加弹窗,提示用户在使用工具之前要先【设置】。在设置界面,我们主要修改了【预览文件】…

golang 自动生成文件头

安装koroFileHeader控件 打开首选项&#xff0c;进入设置&#xff0c;配置文件头信息"fileheader.customMade": {"Author": "lmy","Date": "Do not edit", // 文件创建时间(不变)// 文件最后编辑者"LastEditors"…

研究生选控制嵌入式还是机器视觉好?

研究生选控制嵌入式还是机器视觉好&#xff1f; 我是嵌入式/硬件方向转的算法&#xff0c;现在是公司的算法负责人&#xff0c;如果再让我选一次&#xff0c;我是不会再选嵌入式方 向&#xff0c;嵌入式如果只做技术是没前途的。 你要是有一定自学能力&#xff0c;能自己在学校…

好物周刊#7:炫酷的浏览器标签页

村雨遥的好物周刊&#xff0c;记录每周看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;每周五发布。 一、项目 1. Qexo 一个快速、强大、漂亮的在线 Hexo 编辑器&#xff0c;支持以下功能&#xff1a; 自定义图床上传图片在线配置编辑在线页面管理开放 API自…

Microsoft Windows 部署工具包(MDT)

什么是Microsoft部署工具包(MDT) Microsoft部署工具包(MDT)使用 Windows 评估和部署工具包(ADK)将操作系统部署到网络中的 Windows 客户端和服务器计算机。它支持零接触安装(ZTI)、轻接触安装(LTI)和用户驱动安装(UDI&#xff09;。 Microsoft部署工具可用于将基于 Windows 的…

【FAQ】安防监控视频云存储平台EasyNVR对接EasyNVS时,一直不上线该如何解决?

视频安防监控平台EasyNVR可支持设备通过RTSP/Onvif协议接入&#xff0c;并能对接入的视频流进行处理与多端分发&#xff0c;包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等多种格式。 近期有用户在使用安防视频平台EasyNVR对接上级平台EasyNVS时&#xff0c;出现了一直不上线…

AI AIgents时代-(四.)应用上手

HuggingGPT & MetaGPT . &#x1f7e2; HuggingGPT HuggingGPT是一个多模型调用的 Agent 框架&#xff0c;利用 ChatGPT 作为任务规划器&#xff0c;根据每个模型的描述来选择 HuggingFace 平台上可用的模型&#xff0c;最后根据模型的执行结果生成总结性的响应。 这个项…

优化系统报错提示信息,提高人机交互(三)

对于业务比较复杂的接口&#xff0c;可能存在方法嵌套&#xff0c;每个方法都可能会报错&#xff0c;出现异常&#xff0c;那么需要把异常信息返回给接口调用者&#xff0c;如何实现呢&#xff1f; &#xff08;1&#xff09;捕获异常进行处理&#xff0c;不返回 controller代码…

【网络八股】TCP八股

网络八股 请简述TCP/IP模型中每层的作用&#xff0c;典型协议和典型设备介绍一下三次握手的过程介绍一下四次挥手的过程必须三次握手吗&#xff0c;两次不行吗&#xff1f;为什么ACK数据包消耗TCP的序号吗三次握手中可以携带应用层数据吗四次挥手时&#xff0c;可以携带应用层数…

时序数据库 TimescaleDB 安装与使用

TimescaleDB 是一个时间序列数据库&#xff0c;建立在 PostgreSQL 之上。然而&#xff0c;不仅如此&#xff0c;它还是时间序列的关系数据库。使用 TimescaleDB 的开发人员将受益于专门构建的时间序列数据库以及经典的关系数据库 (PostgreSQL)&#xff0c;所有这些都具有完整的…

收款码的费率都是多少

不管是微信还是支付宝&#xff0c;商户最低的收款手续费率可以达到0.2%费率。一般我们普通商户的收款费率一般在0.6左右&#xff0c;当然也有使用0.3的&#xff0c;也就是1万元的费率是30-60块钱&#xff0c;对于一些流水比较大的商家来说&#xff0c;确实很有必要把这个手续费…

【Java 基础篇】Java字节字符流详解:轻松读写文本与二进制数据

在Java编程中&#xff0c;对文件和数据的读写操作是非常常见的任务。为了满足不同需求&#xff0c;Java提供了多种流类来处理输入和输出。本篇博客将详细介绍Java中的字节流和字符流&#xff0c;以及它们的使用方法&#xff0c;帮助初学者更好地理解和运用这些流来处理文件和数…

三个月备考浙大MEM项目笔试的主要提分机会

随着各个专业陆续公布今年的硕士招生计划&#xff0c;2024年在职备考研究生也到了最后的倒计时阶段&#xff0c;距离MEM联考三个月时间开始备考&#xff0c;有哪些关键的提分机会可以关注&#xff1f;专注联考的杭州达立易考教育认为三个方面需要特别关注。 第一个提分机会来自…

Jenkins学习笔记4

配置构建流程&#xff1a; Jenkins任务创建&#xff1a; 1&#xff09;创建新任务&#xff1a; 把这个Accept first connection改成 No Validation。问题得到解决。 说明下&#xff0c;要确认下主分支的名称是master还是main。 构建触发器这块暂时没有需要配置的。 传输文件…

notepad++编辑多个位置

在notepad设置多次点击不同的位置&#xff0c;然后同时操作这多个位置的方法&#xff1a; 1、选择编辑&#xff0c;首选项&#xff1a; 2、选择多点编辑&#xff1a;

如何使用Java爬取指定链接的网页内容

在当今信息时代&#xff0c;互联网上的数据量庞大且不断增长。为了获取特定网页的内容&#xff0c;爬虫技术成为了一种非常有用的工具。本文将介绍如何使用Java编程语言来实现爬取指定链接的网页内容。 首先&#xff0c;我们需要准备好Java开发环境。确保你已经安装了Java Deve…