数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
思路一:采用哈希表存储每个数字以及它出现的次数。
# -*- coding:utf-8 -*-
class Solution:
def MoreThanHalfNum_Solution(self, numbers):
# write code here
hashMap = {}
for item in numbers:
hashMap[item] = hashMap.get(item, 0) + 1
for key, value in zip(hashMap.keys(), hashMap.values()):
if value > len(numbers) / 2:
return key
return 0
思路二:采用阵地攻守思想。第一个数字作为第一个士兵,守阵地,counter记为1,遇到相同的元素,counter+=1;遇到不同的元素,即为敌人,同归于尽,counter-=1;遇到counter等于0的情况,则挑选当前数字作为守阵地的士兵,继续下去。最后仍然留在阵地上的士兵有可能是出现次数超过一半的数字。
# -*- coding:utf-8 -*-
class Solution:
def MoreThanHalfNum_Solution(self, numbers):
# write code here
number = numbers[0]
counter = 1
for i in range(1, len(numbers)):
if counter == 0:
number = numbers[i]
counter += 1
else:
if numbers[i] != number:
counter -= 1
else:
counter += 1
if sum([1 for item in numbers if item == number]) > len(numbers) / 2:
return number
else:
return 0
思路三:借鉴快排的思想找到位于中间的那个元素。数组中如果有一个数字出现的次数超过了一半,那么经过排序后,位于中间的那个数字一定就是要找的那个数字。