title: leetcode-169. 求众数
date: 2019-9-18 20:21:07
comments: true
categories: “leetcode”
tags:
- leetcode 简单难度
- 分治法
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于⌊ n/2 ⌋
的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。
示例 1:
输入: [3,2,3]
输出: 3
示例 2:
输入: [2,2,1,1,1,2,2]
输出: 2
我的确靠着分治,是没有想出来该如何解决这个问题,主要是最后的基本的比较该如何写。
然后看了网上的,比较厉害就是。在进入函数的列表,即使有递归调用,但是函数返回后其本身的数组,在此时是一个东西,也就是可以用遍历比较左右两边哪个众数出现的次数更多。
给出博客地址:地址
class Solution:
def majorityElement(self, nums: List[int]) -> int:
#
if len(nums) == 0:
return None
if len(nums) == 1:
return nums[0]
else:
mid = len(nums) // 2
u = nums[:mid]
v = nums[mid:]
left = self.majorityElement(u)
right = self.majorityElement(v)
if left == right:
return left
else:
left_count = right_count = 0
for i in nums:
if i == left:
left_count = left_count + 1
elif i == right:
right_count = right_count + 1
if left_count > right_count:
return left
else:
return right
提交后,可以查看别人提交过得代码。这里我随便看了一个。
比较好,就是使用python的集合来封装,然后判断出现的次数是否过半。
class Solution:
def majorityElement(self, nums: List[int]) -> int:
if len(nums) == 0:
return None
if len(nums) == 1:
return nums[0]
else:
dic = {}
# 封装
for i in nums:
dic[i] = dic.get(i, 0) + 1 # 如果没有,返回次数value=0,否则返回value
# 求次数最多的
for i in dic:
if dic[i] > len(nums) // 2:
return i
return None
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/majority-element