leetcode-多数元素

本文介绍了如何使用暴力解法和字典实现查找数组的多数元素,以及进阶讨论了如何通过摩尔投票算法在O(n)时间复杂度和O(1)空间复杂度下解决该问题。算法通过维护候选众数和计数器动态判断元素是否为众数。
摘要由CSDN通过智能技术生成

169. 多数元素

此题其实是在寻找众数,使用暴力解法,运用字典

class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        length = len(nums)
        num_mapping = {}
        for n in nums:
            num_mapping[n] = num_mapping.get(n, 0) + 1
        for k, v in num_mapping.items():
            if v > length // 2:
                return k

题目中有个进阶:

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

使用摩尔投票算法

摩尔投票算法是一种在线性时间和常数空间内寻找数组或流中的众数的算法。它的基本思想是维护一个候选众数和一个计数器,遍历数组时,如果遇到的数和当前的候选众数相同,则计数器加一;如果不同,则计数器减一。当计数器为零时,更新候选众数为当前元素。最后剩下的候选众数即为众数。

摩尔投票算法的步骤如下:

  1. 初始化一个候选众数 candidate 和一个计数器 count。
  2. 遍历数组中的每个元素 num。
  3. 如果 count 为零,将 candidate 更新为 num,并将 count 设置为 1。
  4. 如果 num 等于 candidate,将 count 加 1。
  5. 如果 num 不等于 candidate,将 count 减 1。
  6. 遍历结束后,candidate 即为众数。

需要注意的是,摩尔投票算法只能找到一个众数,如果数组中存在多个众数,该算法可能无法找到所有众数。此外,算法假设给定的数组总是存在众数。

class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        count= 0
        res = None
        for n in nums:
            if count == 0:
                res = n
            count += (1 if n == res else -1)
        return res

  • 14
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值