【题目描述】
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
【解题思路】
数组中出现次数超过一半的数字的意思是,如果有这样的数字存在,那么这个数字出现的次数比其他所有的数字出现的次数之和都要大。所以我们可以设置两个变量,res用来记录在一个区段内出现次数最多的数字,cnt用来记录在当前的位置上,出现最多的数字比其它数字多出现的次数——当出现了和res相同的数字时,出现最多的数字比其它数字多出现的次数又多了1,所以cnt+=1;当出现了和res不相同的数字时,出现最多的数字比其它数字多出现的次数少了1,所以cnt-=1;当cnt=0的时候,出现最多的数字和其它数字出现的次数相同,重新进行记录。具体操作如下:
-
初始化cnt,令cnt=0
-
遍历数组:
- 如果cnt=0,则将当前数字赋给res,且cnt+=1
- 如果cnt!=0且当前数字和res相等,则cnt+=1
- 如果cnt!=0且当前数字和res不相等,则cnt-=1
-
最后统计res出现的次数是否超过一半,若是,则返回res;若不是,返回0
用Python实现的代码如下:
# -*- coding:utf-8 -*-
class Solution:
def MoreThanHalfNum_Solution(self, numbers):
# write code here
cnt = 0
res = numbers[0]
for i in range(len(numbers)):
if cnt == 0:
res = numbers[i]
cnt += 1
else:
if numbers[i] == res:
cnt += 1
else:
cnt -= 1
cnt = numbers.count(res)
if cnt > len(numbers)//2:
return res
else:
return 0