题目
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/majority-element
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
参考解法
从多数元素的定义我们可以知道,一个数组如果存在多数元素,那么其多数元素只有一个,并且这个元素出现的次数大于其长度的一半,而我们的方法就是遍历数组,查看遍历到的元素在数组中的出现次数是否符合要求,如果符合,直接返回,不符合,则将这个元素(包括与这个元素值相等的元素)从数组中删除,遍历剩余的元素。参考代码如下:
def majorityElement(nums: list):
# 求出这个数组长度的一半,多数元素出现的次数必须大于这个数
length_half = len(nums)/2
# 定义一个变量i,用来作为遍历数组的下标,开始遍历
i = 0
# 当i小于数组的长度时,遍历。这里数组的长度每次都会计算一次。
while i < len(nums):
# 如果nums[i]满足要求,则返回这个元素
if nums.count(nums[i]) > length_half:
return nums[i]
# 如果不满足要求,则将这个元素连同值等于他的元素全部删除
else:
nums = [j for j in nums if nums[j]!=nums[i]]
官方解法一:先排序,然后直接找出下标为len(nums)//2的元素。
def majorityElement(nums: list):
nums.sort()
return nums[len(nums)//2]
官方解法二:用哈希表统计每个元素出现的次数
def majorityElement(nums: list):
from collections import Counter
counts = Counter(nums)
return max([counts.keys(),key = counts.get])
官方解法三:Boyer-Moore 投票算法
用一个变量candidate来保存众数,默认为数组第一个值,用counts变量来统计,过程为如果counts为0,则将当前遍历到的元素赋值给candidate;如果不为0,那么如果当前元素等于candidate,则给counts加1,否则减1。
参考代码
def majorityElement(nums: list):
candidate = 0
counts = 0
for i in nums:
if counts == 0:
candidate = i
counts = counts + ( 1 if i==candidate else -1)
return candidate
官方解法原文链接:官方解法原文