1.题目
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
2.思路
解法1:对数组进行排序,如果该数存在,那么一定就是排序数组中间的数,判断这个数的个数是否大于一半,如果是,返回这个数,否则返回0。
解法2:假设第一个数字是众数,遍历数组,若元素 == 当前众数res则count += 1,否则count -= 1;
在下次count == 0时,意味着当前众数res的数量为已遍历元素一半;这种情况下,剩余数组众数仍等于原数组众数(因为最坏的情况是已遍历数组中一半是数组众数,一半是非众数)。
因此,在每次count == 0时,记录当前数字为当前众数,当遍历完整个数组时,留下的res一定为整个数组的众数(最坏情况是在最后一个元素才找到众数,前面的count全部抵消)。
最后验证这个数是否出现了一半以上。
3.方法
方法一:
# -*- coding:utf-8 -*-
class Solution:
def MoreThanHalfNum_Solution(self, numbers):
# write code here
count = 0
numbers.sort()
res = numbers[len(numbers)/2]
for i in numbers:
if i == res:
count += 1
if count > len(numbers)/2:
return res
else:
return 0
方法二:
class Solution:
def MoreThanHalfNum_Solution(self, numbers):
res=numbers[0]
count = 0
for i in numbers:
if res == i:
count +=1
else:
count -=1
if count < 0:
res = i
count = 1
count2 = 0
for i in numbers:
if res == i:
count += 1
if count > len(numbers)/2:
return res
else: return 0