数组中出现次数超过一半的数字
描述 给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。
数据范围:0n≤50000,数组中元素的值 0≤val≤10000
要求:空间复杂度:O(1),时间复杂度 O(n)
输入描述: 保证数组输入非空,且保证有解
思路:可以排序,但是排序复杂度是O(nlogn),空间复杂度也不会低,也可以遍历然后计数,如果次数大于数组长度的一半,则返回,时间、空间复杂度是O(n)。
最后一种解法是看评论得出的,评论大神牛,就是两两想消,最后剩下的就是结果。因为保证一定会有解,所以能坚持到最后的就是结果了
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param numbers int整型一维数组
# @return int整型
#
class Solution:
def MoreThanHalfNum_Solution(self , numbers: List[int]) -> int:
# write code here
#解法一:哈希法
# a = {}
# for i in numbers:
# if i in a:
# a[i] += 1
# else:
# a[i] = 1
# if a[i] > len(numbers) / 2:
# return i
#解法二,相邻两个数若不同则消除,相同则计数
result = numbers[0]
count = 0
for i in numbers:
if count == 0:
result = i
if i == result:
count += 1
else:
count -= 1
return result