leetcode多数元素

文章介绍了三种方法来找出数组中的多数元素,即出现次数超过n/2的元素。第一种是随机化算法,通过随机选择并检查元素出现次数。第二种是排序后取中间元素,适用于已排序数组。第三种采用了Boyer-Moore投票算法,通过动态计数找到众数。
摘要由CSDN通过智能技术生成

 

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

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

示例 1:

输入:nums = [3,2,3]
输出:3
示例 2:

输入:nums = [2,2,1,1,1,2,2]
输出:2
 

提示:
n == nums.length
1 <= n <= 5 * 104
-109 <= nums[i] <= 109

法一、随机化算法,从算法设计的第八章得到的,在这道题效果还算可以

import random
class Solution(object):
    def majorityElement(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        
        while True:
            a=random.choice(nums)
            if sum(1 for i in nums if i == a) > len(nums)//2:
                # 如果 a 在 nums 中出现的次数大于半数,则返回该值
                return a
        return None

 

这段代码中使用了随机化算法来查找给定整数列表的众数。算法流程如下:

  1. 随机从列表中选取一个元素。

  2. 对于该随机元素,计算其出现次数是否超过了一半。若是,则返回该元素,否则重复上述步骤。

由于随机性的存在,该算法不保证每次查找都能成功找到出现次数超过一半的众数。但,在样本容量和众数占比越高时,该算法成功找到众数的概率也会越高。

时间复杂度:该算法的时间复杂度是 O(∞) 的,因为在最坏情况下,可能需要无限次地重新选择随机数才能找到最终的众数。不过在平均情况下,该算法通常能够呈指数级别的优势,并且能够以较小的样本容量找到众数。显然,如果列表中不存在众数,则该算法就会变得非常低效。

空间复杂度:该算法并不需要额外的空间来存储中间结果,因此其空间复杂度为 O(1)。

需要注意的是,虽然随机化算法看起来很简单,但它的正确性需要更多的理论研究来支持,并且难以评估其性能和优越性。因此,在使用时需要谨慎分析问题的规模、贡献度和数据分布情况等因素,确定并优化算法选择,从而获得更好的效果。

法二、很简单,绝了

class Solution(object):
    def majorityElement(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        nums.sort()
        return nums[len(nums)//2]

法三、


class Solution(object):
    def majorityElement(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        count=nums[0]
        k=0
        for i in nums:
            if count==i:
                k+=1
            else:
                k-=1
            if k==0:
                count=i
                k=1
        return count

该段代码实现了查找给定数组中的众数(出现次数超过一半的元素)的功能。算法使用了 Boyer-Moore 投票算法,通过遍历数组并使用计数器来动态确定当前众数的候选对象,并在遇到非候选元素时对计数器进行相应的修改,以便不断地更新众数的值。

具体流程如下:

  1. 初始化计数器 k 为零,保存候选众数 count 为数组中的第一个元素。

  2. 遍历数组中的每个元素 i,如果其与候选众数 count 相等,则将 k 加一;否则将 k 减一。

  3. 在任意一个时刻,如果 k 的值变为零,则从当前位置开始重新选择新的候选众数,并将 k 赋值为 1。

  4. 最终,遍历完成后的 count 值即为众数,返回其值即可。

需要说明的是,该算法的正确性得以保证的前提条件是该数组中存在众数,否则可能会得到错误的结果。

此外,该算法的时间复杂度为 �(�)O(n),空间复杂度为 �(1)O(1),是一种相对高效的解决众数问题的算法实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值