题目来源:
https://leetcode-cn.com/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-lcof/
https://leetcode-cn.com/problems/majority-element/
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
解法一:哈希
用哈希统计数组中各个数字出现的次数,返回次数最高的那个数字。
解法二:摩尔投票法
把众数记为+1,其他数记为-1,那么整个数组的和必定大于0。步骤:
- 初始化一个候选人candidate(可以定位数组的第一个元素),cnt=0
- 遍历数组,遇到一个数和candidate相等则cnt+1,否则cnt-1。
- 最后返回candidate就是众数。
举例,如[1,2,1],candidate初始为1,cnt=0,遇到1时,cnt+1=1,遇到2时,cnt-1=0,再遇到1时,由于cnt=0,candidate再次被赋值1,返回1,为众数。
class Solution(object):
def majorityElement(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
bondary = len(nums) / 2
cnt = 0
for num in nums:
if cnt == 0:
candidate = num
cnt += (1 if num == candidate else -1)
return candidate