题目:
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
思路1:
先排序,统计次数,超过一半就停止循环。
这里用sorted()排序,在做笔试的题的时候很快,但是在面试的时候,面试官会希望你排序的内容也要写出来,那么排序最快也得O(nlogn),算法的复杂度就高了。因此,该方法只在想不出优化的时候用,推荐后面的解法。
class Solution:
def MoreThanHalfNum_Solution(self, numbers):
# write code here
if (len(numbers) == 0):
return 0
halflen = len(numbers) / 2
numbers = sorted(numbers)
i = 0
count = 1
while (i < len(numbers)):
if ((i + 1 <= (len(numbers) - 1) and numbers[i] == numbers[i + 1] )):
count = count + 1
if (count > halflen):
return numbers[i]
else:
if (count > halflen):
return numbers[i]
else:
count = 1
i = i + 1
return 0
思路2:
首先题干说明找的数一定存在,那么数的个超过了数组的一半,数组最中间的数一定是我们找的数,所以该问题等于找一个数组的中位数。接下来考虑如何找中位数。
利用partition的思想
快排的核心方法是Partition函数,它的作用就是将整个数组分成小于基准值的左边,和大于基准值的右边。
那么对于数组,随机选取一个数,比它小的放左边,比它大的放右边,如果该数的下标刚好为n/2,该数就是中位数。如果下标