题目 :求众数
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。
示例 :
输入: [3,2,3], 输出: 3
输入: [2,2,1,1,1,2,2], 输出: 2
------------------------------------------------------------------------------
解法1:直接用字典统计词频,然后输出词频大于n/2的key。
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#:网友的想法真是一阵见血!题目给出的条件,"众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素",说明按大小排序后,该众数一定在 "中间位置"。
注意:sorted() 给出的结果是list,接受的参数只能是能整除整数,不能是小数float。
sorted() 函数对所有可迭代的对象进行排序操作。
sort 与 sorted 区别:
sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。
list 的 sort 方法返回的是对已经存在的列表进行操作,无返回值,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。
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#:通过set()提出重复元素,然后通过count()遍历查到nums中词频大于n/2的。
class Solution(object):
def majorityElement(self, nums):
n = len(nums)
if n == 1:
return nums[0]
res= set(nums)
for num in res:
if(nums.count(num)>(n/2)):
return num
解法4#:巧用max(),lambda() 函数。需要注意,直接使用 max(dic.items())是对字典的key比较大小,需要通过 key=lambda x: x[1]来限定比较的是value,也就是词频。
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
else:
dic[num] = 1
return max(dic.items(), key=lambda x: x[1])[0]
参考:
https://www.runoob.com/python/python-func-sorted.html