数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2
方法1:抵消,若一个数超过一半,那么最后一定会剩下
- 遍历数组,若两数不同,则互相抵消
- 若相同则个数+1
Python
class Solution:
def majorityElement(self, nums: List[int]) -> int:
n = 0
ex = None
for i in nums:
if n == 0:
ex = i
n+=1
elif ex !=i:
n-=1
else:n+=1
return ex
方法2:
- 遍历数组,计数,将数组中的数作为key,将其出现的次数作为值存入字典当中
- 遍历字典,寻找值最大的key输出
Python
class Solution:
def majorityElement(self, nums: List[int]) -> int:
dic = {}
for i in nums:
if i in dic: dic[i]+=1
else: dic[i] = 1
key_max = 0
va = 0
for key in dic:
if dic[key]>va:
key_max = key
va = dic[key]
return key_max
方法2改进:无需进行步骤2遍历字典, 只在生成字典时加一个判断值是否大于len(nums)/2即可
Python
class Solution:
def majorityElement(self, nums: List[int]) -> int:
dic = {}
for i in nums:
if i in dic: dic[i]+=1
else: dic[i] = 1
if dic[i]>len(nums)/2:
return i