news 2026/5/6 11:32:43

20 . 多数元素

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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博客

赶快动起手来吧!


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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/5 20:35:23

Stop-motion-OBJ插件完全指南:从零开始制作精美3D动画

还在为Blender中导入网格序列而烦恼吗&#xff1f;&#x1f914; Stop-motion-OBJ插件让这一切变得简单&#xff01;这个强大的工具能帮你轻松导入OBJ、STL、PLY等格式的网格文件&#xff0c;将它们转化为流畅的3D动画。无论你是新手还是专业人士&#xff0c;这份指南都将带你快…

作者头像 李华
网站建设 2026/5/6 3:01:28

R.swift升级实战:从旧版本到新架构的完整迁移手册

R.swift升级实战&#xff1a;从旧版本到新架构的完整迁移手册 【免费下载链接】R.swift Strong typed, autocompleted resources like images, fonts and segues in Swift projects 项目地址: https://gitcode.com/gh_mirrors/rs/R.swift 在Swift项目开发中&#xff0c;…

作者头像 李华
网站建设 2026/4/30 7:37:27

WindowResizer终极指南:5分钟掌握窗口尺寸强制调整技巧

WindowResizer终极指南&#xff1a;5分钟掌握窗口尺寸强制调整技巧 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 你是否曾经遇到过那些顽固的应用程序窗口&#xff1f;它们要么尺…

作者头像 李华
网站建设 2026/5/5 7:32:18

66、XML解析:SAX与DOM方法全解析

XML解析:SAX与DOM方法全解析 1. 使用SAX解析XML 在大多数情况下,从XML文档中提取信息的最佳方式是使用符合SAX(Simple API for XML)标准的事件驱动解析器来解析文档。SAX定义了一个标准API,可以在许多不同的底层解析器之上实现。SAX解析方法与大多数HTML解析器有相似之处…

作者头像 李华
网站建设 2026/5/1 9:10:34

Peek:终极简单的Linux动态GIF录制神器

Peek&#xff1a;终极简单的Linux动态GIF录制神器 【免费下载链接】peek Simple animated GIF screen recorder with an easy to use interface 项目地址: https://gitcode.com/gh_mirrors/pe/peek 还在为制作屏幕演示而烦恼吗&#xff1f;&#x1f914; Peek是一款专为…

作者头像 李华
网站建设 2026/5/4 7:00:10

68、利用 Python 的 C API 扩展 Python

利用 Python 的 C API 扩展 Python 1. C 编写的 Python 扩展模块概述 C 函数 initx 通常具有以下整体结构: void initx(void) {PyObject* thismod = Py_InitModule3("x", x_methods, "docstring for x");/* 可选:调用 PyModule_AddObject(thismod,…

作者头像 李华