LeetCode刷题之HOT100之多数元素

2024/5/21 起床走到阳台,外面绵柔细雨,手探出去,似乎感受不到。刚到实验室,窗外声音放大,雨大了。昨天的两题任务中断了,由于下雨加晚上有课。这样似乎也好,不让我有一种被强迫的感觉,随心所欲些也好,做题!

1、题目描述

在这里插入图片描述

2、逻辑分析

题目要求就是找出在数组中数量占比大于整个数组长度n的一半的元素。我的思路:第一步:将数组里面的元素遍历记录出现的个数;第二步:将他们与n/2比较。

在这里我突然又想到:数量超过一般的元素具有唯一性,那么算法可不可以优化一下:将数组中存在数量最多的元素来跟n/2比较。这里使用哈希表。

3、代码演示

public int majorityElement(int[] nums) {// 使用一个Map来统计每个数字出现的次数  Map<Integer, Integer> counts = countNums(nums);// 定义一个变量来存储多数元素及其计数,初始化为nullMap.Entry<Integer, Integer> majorEntry = null;// 遍历Map中的每个元素for(Map.Entry<Integer, Integer> entry : counts.entrySet()){// 如果majorEntry是null,或者当前元素的计数大于majorEntry的计数if(majorEntry == null || entry.getValue() > majorEntry.getValue()){// 更新majorEntry为当前元素 majorEntry = entry;}}// 返回多数元素的键(即多数元素本身)return majorEntry.getKey();}// 定义一个私有方法,用于统计数组中每个数字的出现次数并返回结果Map private Map<Integer,Integer> countNums (int [] nums){// 创建一个HashMap来存储数字及其出现次数Map<Integer , Integer> counts = new HashMap<Integer, Integer>();for(int num : nums){// 如果该数字尚未在Map中出现过if(!counts.containsKey(num)){// 将该数字添加到Map中,并设置其出现次数为1counts.put(num,1);}else{// 如果该数字已在Map中出现过,则增加其出现次数counts.put(num,counts.get(num) + 1);}}// 返回存储了每个数字及其出现次数的Mapreturn counts;}

这里使用了哈希表将元素作为键,元素的数量作为值。然后遍历哈希表,找到键值对中值最大的元素,最后返回该元素。技术难点是对哈希表还是不够熟练,特别是map.entry这里,都不知道还可以这样用。

时间复杂度:O(n),空间复杂度:O(n)。

这道题的解法好多啊,还有:排序、随机化、分治、Boyer-Moore 投票算法。

下面我们主要来说一下最后一个Boyer-Moore 投票算法,也称为摩尔投票算法。官方的思路解法太过于官方,这里选取了其他题解:

在这里插入图片描述

下面直接看代码:

public int majorityElement(int[] nums) {// 计数器,用于追踪当前候选的多数元素的数量int count = 0;// 候选的多数元素  Integer candidate = null;// 遍历数组中的每个元素for(int num : nums){// 如果计数器为0,则更新候选的多数元素为当前遍历到的元素if(count == 0){candidate = num;}// 如果当前元素与候选的多数元素相同,则计数器加1;否则减1 count += (num == candidate) ? 1 : -1;}// 返回候选的多数元素return candidate;}

时间复杂度:O(n),空间复杂度:O(1)。

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

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

相关文章

React-入门

React由Meta公司研发&#xff0c;是一个用于构建Web和原生交互界面的库 既可以写基于浏览器的应用&#xff0c;还可以写苹果和安卓的原生应用 优势 开发环境搭建 create-react-app是一个快速创建React开发环境的工具&#xff0c;底层是由Webpack构建&#xff0c;封装了配置细…

江协科技STM32学习-0 购买套件

前言&#xff1a; 本文是根据哔哩哔哩网站上“江协科技STM32”视频的学习笔记&#xff0c;在这里会记录下江协科技STM32开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了江协科技STM32教学视频和链接中的内容。 引用&#xff1a; STM32入门教程-2023版 细致讲…

Servlet跳转404(解决)

1.解决无法跳转的404问题&#xff08;最根本&#xff0c;最重要&#xff09; 查看Project Structure&#xff0c;检查你的JDK版本不要选错版本&#xff1b; 2.页面跳转&#xff0c;url栏输入的是web.xml中的url-pattern内容&#xff0c;请仔细检查 3.关于配置信息Applicatio…

鸿蒙HarmonyOS开发:tabs结合tabContent实现底部tabBar导航栏页面布局

文章目录 一、组件介绍1、Tabs参数属性事件TabsController 2、子组件属性说明 二、基础示例1、基础顶部导航2、效果3、可以滚动导航栏2、效果 三、扩展示例自定义导航栏1、代码2、效果 一、组件介绍 Tabs组件的页面组成包含两个部分&#xff0c;分别是TabContent和TabBar。Tab…

iec61850通信协议是什么

EC 61850是国际电工委员会&#xff08;IEC&#xff09;制定的一个用于电力系统自动化的国际标准。该协议广泛应用于变电站自动化、配电网自动化和智能电网等领域&#xff0c;旨在实现不同设备和系统之间的互操作性和高效通信。本文将详细介绍IEC 61850通信协议的特点、架构、关…

力扣HOT100 - 138. 随机链表的复制

解题思路&#xff1a; class Solution {public Node copyRandomList(Node head) {if(headnull) return null;Node p head;//第一步&#xff0c;在每个原节点后面创建一个新节点//1->1->2->2->3->3while(p!null) {Node newNode new Node(p.val);newNode.next …

【原创 精华】渗透测试-信息收集

一切需要用到的软件均已备份到百度云和阿里云 没有链接的文件请在本地渗透工具文件夹或是 kali 里查看 能用 fofa 的尽量用 包括查 ip&#xff0c;端口扫描&#xff0c;子域名&#xff0c;蜜罐 子域名收集 工具 子域名挖掘机&#xff08;本地文件有&#xff09; 通过爆破…

Ovid医学库文献如何在家查找下载

今天讲的数据库是一个知名医学库——Ovid Ovid隶属于威科集团的健康出版事业集团&#xff0c;与LWW、Adis等公司属于姊妹公司。Ovid数据库在医学外文文献数据库方面占据绝对地位&#xff0c;目前已有包涵人文、科技等多领域数据库300个&#xff0c;其中80多个是生物医学数据库…

CTF解题技能之MISC基础

杂项介绍 Miscellaneous简称MISC&#xff0c;意思是杂项&#xff0c;混杂的意思。 杂项大致有几种类型&#xff1a; 1.隐写 2.压缩包处理 3.流量分析 4.攻击取证 5.其它 本篇主要介绍杂项基础题目的知识点以及解题思路。 0x00 文件类型识别 杂项题目主要是以文件附件作…

Mac免费软件推荐

1. iTerm2 - 功能强大的终端 iTerm2 是一个功能强大且灵活的终端仿真器&#xff08;可替代系统默认终端&#xff09;&#xff0c;适合需要在 macOS 上进行大量终端操作的用户。其丰富的功能和高可定制性使得 iTerm2 成为许多开发者和系统管理员的首选工具。无论是处理多个会话…

【ARFoundation自学03】平面追踪可视化效果美化

对已检测到的平面默认的渲染效果显得有些生硬和突兀&#xff0c;有时我们需要更加友好、美观的的平面虚拟界面&#xff0c;这时就需要对已检测到的平面定制个性化的可视方案。为达到更好的视觉效果&#xff0c;处理的思路如下。 视觉效果前后对比&#xff01; &#xff08;本节…

Spring:事务(tx)

1. 简介 spring对jdbc进行封装&#xff0c;简化对数据库的操作 2. HelloWorld 1. 搭建模块 2.加入依赖 <dependencies><!--spring jdbc Spring 持久化层支持jar包--><dependency><groupId>org.springframework</groupId><artifactId>s…

力扣刷题--1528. 重新排列字符串【简单】

题目描述 给你一个字符串 s 和一个 长度相同 的整数数组 indices 。 请你重新排列字符串 s &#xff0c;其中第 i 个字符需要移动到 indices[i] 指示的位置。 返回重新排列后的字符串。 示例 1&#xff1a; 输入&#xff1a;s “codeleet”, indices [4,5,6,7,0,2,1,3] 输…

Clickhouse 嵌套数据类型总结—— Clickhouse 基础篇(三)

文章目录 创建嵌套类型的表插入读取数据在嵌套类型上使用数组函数 在 clickhouse 中存储嵌套类型的关键字是 Nested, 只支持一级嵌套。数据结构类似于在数据结构类似于在表的单元格里面嵌套“一张表格”&#xff0c;如下图所示&#xff1a; 嵌套类型是列存储&#xff0c;本质…

【传知代码】遵循人类指令的高质量图像修复(论文复现)

前言&#xff1a;在数字化时代的浪潮中&#xff0c;图像已成为我们生活中不可或缺的一部分。它们记录着我们的记忆&#xff0c;传递着信息&#xff0c;甚至塑造着我们的认知。然而&#xff0c;正如生活中难以避免的瑕疵&#xff0c;这些数字图像也时常因为各种原因出现损伤、失…

RangeNet++ 检测3D点云语义算法的详细配置和常见问题

配置环境&#xff1a; Ubuntu18.04 GPU&#xff1a;GeForce MX150 驱动&#xff1a;Ubuntu推荐的nvidia-driver-470 Cuda10.1 cudnn7.6.2 TensorRT 5.1.5.0GCC 7.5.0 运行代码&#xff1a; RangeNet 目录 目录 一、环境配置 1. Ubuntu 18.04 安装NVIDIA驱动 &…

基于Vue uni-app的自定义列表表格信息展示组件

摘要&#xff1a;随着软件技术的不断发展&#xff0c;前端开发面临着越来越多的挑战。特别是在业务场景复杂多变的情况下&#xff0c;如何提高开发效率和降低维护成本成为了关键。本文旨在探讨组件化开发在前端应用中的重要性&#xff0c;并以Vue uni-app自定义列表表格为例&am…

R语言lavaan结构方程模型(SEM)

结构方程模型&#xff08;Sructural Equation Modeling&#xff0c;SEM&#xff09;是分析系统内变量间的相互关系的利器&#xff0c;可通过图形化方式清晰展示系统中多变量因果关系网&#xff0c;具有强大的数据分析功能和广泛的适用性&#xff0c;是近年来生态、进化、环境、…

I.MX6ULL模仿 STM32 驱动开发格式实验

系列文章目录 I.MX6ULL模仿 STM32 驱动开发格式实验 I.MX6ULL模仿 STM32 驱动开发格式实验 系列文章目录一、前言二、模仿 STM32 寄存器定义2.1 STM32 寄存器定义简介2.2 I.MX6Ul 寄存器定义2.3硬件原理图2.4实验程序编写 三、编译下载验证 一、前言 使用 C 语言编写 LED 灯驱…

2024年中国金融行业网络安全市场全景图

网络安全一直是国家安全的核心组成部分&#xff0c;特别是在金融行业&#xff0c;金融机构拥有大量的敏感数据&#xff0c;包括个人信息、交易记录、财务报告等&#xff0c;这些数据的安全直接关系到消费者的利益和金融市场的稳定&#xff0c;因此金融行业在网络安全建设领域一…