算法刷题第12天|LeetCode 169 多数元素:从暴力到最优解,一次吃透4种解法
大家好,这是我刷题打卡的第12天,今天搞定LeetCode 169 多数元素,顺便整理第二周学习小结~
📌 题目回顾
给定数组 nums,返回出现次数 > ⌊n/2⌋ 的元素,题目保证一定存在。
示例:
- [3,2,3] → 3
- [2,2,1,1,1,2,2] → 2
进阶要求:O(n) 时间 + O(1) 空间 。
🧩 四种解法全实现
1. 哈希表计数(最直观)
遍历数组,用哈希表统计次数,超过一半直接返回。
- 时间:O(n)
- 空间:O(n)
python
def majorityElement(nums):
from collections import defaultdict
cnt = defaultdict(int)
for num in nums:
cnt[num] += 1
if cnt[num] > len(nums)//2:
return num
优点:好写好懂;缺点:占用额外空间。
2. 排序取中位数(极简代码)
多数元素超过一半,排序后中间必为答案。
- 时间:O(n log n)
- 空间:O(log n)~O(1)
python
def majorityElement(nums):
nums.sort()
return nums[len(nums)//2]
一行搞定,面试快速写对很稳。
3. 分治法(递归思想)
把数组切成左右两半,分别求多数,再合并验证。
- 时间:O(n log n)
- 空间:O(log n)
适合练分治思路,工程里一般不用。
4. 摩尔投票法(最优解 ⭐)
核心:多数元素数量 > 其余总和,两两抵消最后必剩它。
- 时间:O(n)
- 空间:O(1)
python
def majorityElement(nums):
candidate = None
count = 0
for num in nums:
if count == 0:
candidate = num
count += 1 if num == candidate else -1
return candidate
算法刷题第12天|LeetCode 169 多数元素:从暴力到最优解,一次吃透4种解法
张小明
前端开发工程师
【A11】身份证号无损压缩到48位的Rust实现
方案概述 将18位身份证号(含校验码)压缩为48位整数(可存储在u64的低48位),布局如下:字段位宽说明addr20 bits行政区划编码(高3位0表示非大陆,否则为大陆)date18 bits出生…
HX711数据不稳定问题
根本原因:PC14/PC15 是 STM32F1 的 OSC32 晶振引脚,即使不启用 LSE,这两个引脚也受备份域保护,有以下严重限制: 最大输出频率仅 3MHz(无法可靠驱动 SCK) 驱动能力极弱(最大灌电流仅 …
光伏四可装置设备性能评估:光伏组件衰减率与逆变器效率监测
光伏组件与逆变器作为光伏系统能量转换、传输的核心设备,其运行性能直接决定系统发电效率、生命周期收益及安全稳定性。光伏四可装置(可观、可测、可控、可调)通过构建精准的性能评估体系,实现组件衰减率与逆变器效率的全周期监测…
商超装修吊楣装饰铝拉网现场复尺
做工程采购这几年,我见过太多供应商在展厅里把样品吹得天花乱坠,一到项目现场就原形毕露。装饰金属网这行尤其如此——材料属性、表面处理、加工精度、交付周期,任何一环出问题,工地上几十号人都得等你。后来我养成了个习惯&#…
【数据结构精讲】线性表四大核心:数组 / Vector、栈、队列、链表(原理 + 模板 + 避坑 + 选型)
一、线性表基础定义线性表是n 个数据元素的有限序列,元素之间满足「一对一」的前驱后继关系,除首尾元素外,每个元素有且仅有一个前驱和一个后继。本文聚焦线性表的四大核心实现:数组 / Vector、栈、队列、链表,从底层原…
亲测可用!GEO源码全套搭建教程(Docker+宝塔双方案,附合法开源源码获取)
亲测可用!GEO源码全套搭建教程(Docker宝塔双方案,附合法开源源码获取) 前言:GEO源码搭建是地理信息开发、位置服务部署领域的核心技能,广泛应用于本地地理数据可视化、企业级位置服务平台搭建及GIS学习场景…