给定一个大小为 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
这段代码中使用了随机化算法来查找给定整数列表的众数。算法流程如下:
-
随机从列表中选取一个元素。
-
对于该随机元素,计算其出现次数是否超过了一半。若是,则返回该元素,否则重复上述步骤。
由于随机性的存在,该算法不保证每次查找都能成功找到出现次数超过一半的众数。但,在样本容量和众数占比越高时,该算法成功找到众数的概率也会越高。
时间复杂度:该算法的时间复杂度是 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 投票算法,通过遍历数组并使用计数器来动态确定当前众数的候选对象,并在遇到非候选元素时对计数器进行相应的修改,以便不断地更新众数的值。
具体流程如下:
-
初始化计数器
k
为零,保存候选众数count
为数组中的第一个元素。 -
遍历数组中的每个元素
i
,如果其与候选众数count
相等,则将k
加一;否则将k
减一。 -
在任意一个时刻,如果
k
的值变为零,则从当前位置开始重新选择新的候选众数,并将k
赋值为 1。 -
最终,遍历完成后的
count
值即为众数,返回其值即可。
需要说明的是,该算法的正确性得以保证的前提条件是该数组中存在众数,否则可能会得到错误的结果。
此外,该算法的时间复杂度为 �(�)O(n),空间复杂度为 �(1)O(1),是一种相对高效的解决众数问题的算法实现。