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

20 . 多数元素

题目介绍

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

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

提示:

  • n == nums.length
  • 1 <= n <= 5 * 104
  • -109 <= nums[i] <= 109
  • 输入保证数组中一定有一个多数元素。

进阶:尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。

class Solution { public: int majorityElement(vector<int>& nums) { } };

全文1500字,阅读+思考 9min

原题链接:169. 多数元素 - 力扣(LeetCode)


解析

1 . 本题需求也很明确,给你一个数组。要求你返回,数组中出现次数大于 size/2的元素值

2 . “统计数组中元素的出现个数” —— mp哈希方法统计

3 . 难道统计完,再来遍历一遍:查看当前元素的出现次数,判断是否大于size/2 ?

class Solution { public: int majorityElement(vector<int>& nums) { map<int,int> mp; for(auto e:nums) { mp[e]++; if(mp[e] > nums.size()/2) return e; } for(auto e:nums) { if(mp[e] > nums.size() / 2) return e; } return 0; } };

4 . 这种方法可行吗,当然可以。

5 . 只是这种方法,不能很好体现“算法”二字——精妙

6 . 能否只需要统计次数一遍后,就能立刻返回出现次数超过size/2的元素?

a . 我们之所以会在统计完所有元素的出现次数不够后,再去范围for遍历一遍查询mp[e]

b . 是因为元素的乱序,导致我们无法一次性统计出某个元素的出现次数

c . 是的,如果我们能让相同的元素排在一起,让mp不断统计

d . 我们总是会统计完当前一个元素所有出现的次数,再去统计下一个数字

e . 这样,我们就可以实现:一边数出现次数,一边判断是否大于nums.size() / 2

7 . 对数组先排序,就能达成如此效果

代码已经跃然纸上:

class Solution { public: int majorityElement(vector<int>& nums) { sort(nums.begin(),nums.end()); map<int,int> mp; for(auto e:nums) { mp[e]++; if(mp[e] > nums.size()/2) return e; } return 0; } };

再优化

1 . 排完序后,如果某个元素次数真的超过一半

2 . 你想这个数组的布局如何

注:不妨就假设两种极端情况

1 . 一定存在一个超过size/2的元素

2 . 极端情况:这一个数全部堆积在最左侧

这一个数全部堆积在最右侧

3 . 这还只是极端情况

4 . 可是它们一定会占用nums[size / 2]

5 . 而不极端的情况:红色框整体往中间挪,必然也会占用nums[size/2]这个格子

3 . 所以直接返回nums[size/2]的元素值,一定是该数组中出现次数超过一半的元素?

4 . 对了一半,首先得把相同的聚在一起——所以前提一定是:排好序

代码也呼之欲出:

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

总结以及完整参考代码

class Solution { public: int majorityElement(vector<int>& nums) { sort(nums.begin(),nums.end()); map<int,int> mp; for(auto e:nums) { mp[e]++; if(mp[e] > nums.size()/2) return e; } return 0; } };
class Solution { public: int majorityElement(vector<int>& nums) { sort(nums.begin(),nums.end()); return nums[nums.size()/2]; } };

本周算法清单:

15 . 有效的括号-CSDN博客

16 . 买卖股票的最佳时机-CSDN博客

17 . 爬楼梯-CSDN博客

18 . 杨辉三角-CSDN博客

19 . 只出现一次的数字-CSDN博客

赶快动起手来吧!


终于本周算法更新完毕,请沉浸式享用,我们下周再见!

http://www.rkmt.cn/news/92274.html

相关文章:

  • 2025年pvc蝶阀,电动蝶阀,气动蝶阀厂家最新推荐,控制稳定性与安装便捷性参考攻略! - 品牌鉴赏师
  • 第四周算法清单
  • 车载 SerDes 学习指南:原理、芯片、选型与工程实践
  • AI如何快速生成50000个有效电子邮件地址
  • 62、Python Web开发:CGI、Cookie及其他服务端方法详解
  • Wan2.1-I2V终极指南:简单三步开启AI图生视频新纪元
  • 如何快速掌握GeoTools:构建专业GIS应用的完整指南
  • 28、Red Hat Linux 9:软件管理、系统配置与网络安全指南
  • 如何用AI自动生成Moment.js日期处理代码
  • ComfyUI商业案例:电商产品图生成实战
  • 18、Linux 网络搭建与服务配置指南
  • FastAPI 性能优化实战:7大核心技巧深度解析
  • nnUNet如何用AI加速医学影像分割开发
  • 2025年12月污泥压滤机,带式压滤机,气化渣脱水专用压滤机厂家权威推荐,脱水率深度解析! - 品牌鉴赏师
  • 零基础教程:5分钟搞定Docker+Nginx
  • 2025年评价高的喷涂缠绕保温管道厂家最新热销排行 - 品牌宣传支持者
  • 2025年本地地毯清洗服务口碑排行,前十名清洗效果实测!海淀靠谱的地毯清洗推荐聚焦技术实力与行业适配性 - 品牌推荐师
  • 2025年口碑好的304不锈钢防爆配电箱/移动式防爆配电箱厂家推荐及选择指南 - 品牌宣传支持者
  • 快速验证:自制IE11离线包生成器原型
  • 2025年如何挑选本地评价好的铝丝打卡机厂家,国内打卡机电话优质品牌榜单更新 - 品牌推荐师
  • 如何甄别空气能热泵厂家的真实力?2025年年终最新行业趋势解读及5家值得信赖的厂家推荐! - 十大品牌推荐
  • 17、D-Bus与systemd:Linux系统核心服务深度解析
  • 2025年12月生活污水超干脱水压滤机,隔膜压滤机,板框压滤机厂家推荐,环保达标设备红榜! - 品牌鉴赏师
  • 1、实用数字取证成像:Linux 工具的力量
  • 开源图形编程文档平台的终极技术革新与社区协作模式深度解析
  • 终极Python视频处理指南:告别复杂命令的ffmpeg-python实战
  • 2025年比较好的不锈钢厂家最新用户好评榜 - 品牌宣传支持者
  • Python小白必看:图解解决‘pip不是内部命令‘
  • 如何快速上手Artillery:完整的负载测试入门指南
  • 文科生也能闯网安!零基础入门网络安全的全攻略​