leetcode每日一题——多数元素

题目

给定一个大小为 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

官方解法原文链接:官方解法原文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值