题目:求众数
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。
示例 :
输入: [3,2,3],输出: 3
输入: [2,2,1,1,1,2,2],输出: 2
--------------------------------------------------------------------------------------
分析:马上能想到的,就是构建数频字典,然后找出数量大于n/2的元素即可。
引申一下,数学思维:根据题设的条件,众数的数量大于总数的一半,那么数组排序后肯定位于数组的中间位置。
解法1: 数频字典
class Solution(object):
def majorityElement(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
n = len(nums)
if n == 1:
return nums[0]
dic = {}
for num in nums:
if num in dic.keys():
dic[num] += 1
if dic[num] > n/2:
return num
else:
dic[num] = 1
解法2#:数学思维
class Solution(object):
def majorityElement(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
n = len(nums)
if n == 1:
return nums[0]
return sorted(nums)[n//2]
解法3#:摩尔投票法
class Solution(object):
def majorityElement(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if len(nums)<1:
return
result = nums[0]
count = 1
for i in range(1,len(nums)):
if result == nums[i]:
count += 1
else:
count -=1
if count ==0:
result = nums[i+1]
return result
参考:
https://blog.csdn.net/qiubingcsdn/article/details/82631411
https://blog.csdn.net/weixin_42521211/article/details/88388651