【技巧】No. 0169 多数元素【简单】👉力扣对应题目指路
![](https://i-blog.csdnimg.cn/direct/53543a8b255e4c448d799a2bc1475df5.png)
希望对你有帮助呀!!💜💜 如有更好理解的思路,欢迎大家留言补充 ~ 一起加油叭 💦
欢迎关注、订阅专栏 【力扣详解】谢谢你的支持!
⭐ 题目描述:给定一个大小为 n 的数组 nums ,返回其中的多数元素
- 多数元素是指在数组中出现次数 大于
⌊ n/2 ⌋
的元素; 你可以假设数组是非空的,并且给定的数组总是存在多数元素
🔥 思路:
摩尔投票法
,属于技巧型方法(本题最佳);还有其他两种方法,但会超时 ⏳,简述如下
- 哈希表统计法: 遍历数组 nums ,用 HashMap 统计各数字的数量,即可找出众数
- 时间和空间复杂度均为 O(N)
- 数组排序法: 将数组 nums 排序,数组中点的元素 一定为众数
- 基于快速排序的代码,放在最后供友友们参考~
![](https://i-blog.csdnimg.cn/direct/512725965d504b5b9dbc0381658ec65f.png)
推论一 🌟: 若记 众数 的票数 votes
为 +1
,非众数 的票数 votes
为 −1
,则一定有所有数字的票数 votes
和 > 0
推论二 💓: 若 前 a 个
数字的票数和 =0
,则 剩余 (n−a) 个
数字的票数和一定仍 >0
,即后 (n−a) 个数字的众数仍为 x
给出
摩尔投票法
(参考力扣题解) 详细步骤如下:核心理念为 票数正负抵消
- 步骤一⭐写出遍历
nums
的基本代码- 步骤二⭐对于遍历到的数字
num
- 如果当前
votes
等于0
, 说明众数在 num 及之后的元素中 (根据推论二 💓),更新x
为num
- 根据推论一🌟
+/- votes
class Solution:
def majorityElement(self, nums: List[int]) -> int:
x = nums[0]
votes = 0
for num in nums: # --------------------------------- step 1
# ----------------------------------------------- step 2
if votes == 0: # ----------------------------- step 2.1
x = num
votes += 1 if num == x else -1 #-------------- step 2.2
return x
⏳⏳⏳ 基于快速排序的解法来啦 ~ 提交会超时 !!!
- 详细步骤与 007/100 几乎完全相同,不在这里 balabala 啦~ 👉LeetCode 热题 HOT 100 (007/100)【宇宙最简单版】
class Solution:
def majorityElement(self, nums: List[int]) -> int:
k = len(nums)//2
def traversal(L, H): # ----------------------------- step 1
if L >= H: return
low = L
high = H
val = nums[L]
while low < high:
while low < high:
if nums[high] > val:
high -= 1
continue
else:
nums[low] = nums[high]
low += 1
break
while low < high:
if nums[low] <= val:
low += 1
continue
else:
nums[high] = nums[low]
high -= 1
break
nums[low] = val
# -------------------------------- 加速! # ----step 2
if low == k: return # -------------------- step 2.1
if low < k: traversal(low+1, H) # ------- step 2.2
if low > k: traversal(L, low-1) # ------- step 2.3
traversal(0, len(nums)-1)
return nums[k]
希望对你有帮助呀!!💜💜 如有更好理解的思路,欢迎大家留言补充 ~ 一起加油叭 💦
🔥 LeetCode 热题 HOT 100