题目
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如[1, 2, 3, 2, 2, 2, 5, 4, 2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。
Python题解
def partition(data, start, end):
left, right = start, end
pivot = data[left]
while left < right:
while left < right and data[right] >= pivot:
right -= 1
data[left] = data[right]
while left < right and data[left] <= pivot:
left += 1
data[right] = data[left]
data[left] = pivot
return left
def check_more_than_half(data, res):
cnt = 0
for num in data:
if num == res:
cnt += 1
if cnt * 2 <= len(data):
return False
return True
def more_than_half_num(data):
if data is None or len(data) == 0:
return 0
data_len = len(data)
middle = data_len / 2
start, end = 0, data_len - 1
index = partition(data, start, end)
while index != middle:
if index > middle:
end = index - 1
else:
start = index + 1
index = partition(data, start, end)
res = data[middle]
if not check_more_than_half(data, res):
res = 0
return res
if __name__ == '__main__':
data = [1, 2, 3, 2, 2, 2, 5, 4, 2]
print more_than_half_num(data)