您的位置:首页 > Web前端

剑指offer 29 数组中出现次数超过一半的数字

2017-09-19 17:19 411 查看

题目描述

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。

思路

如果某个数符合条件,它一定是中位数。因此,找出中位数。

如果一个数num,左边比它小,右边比它大,它的下标是index。如果index < middle,那么中位数在它右边,反之,中位数在它左边。

通过partition,下标为middle的值,它就是中位数。

根据中位数,判断是否符合条件。

代码

# -*- coding:utf-8 -*-
class Solution:
def MoreThanHalfNum_Solution(self, numbers):
# write code here
middle = int(len(numbers) / 2)
start = 0
end = len(numbers) - 1
index = self.partition(numbers, start, end)
while index != middle:
if index < middle:
start = index + 1
index = self.partition(numbers, start, end)
elif index > middle:
end = index - 1
index = self.partition(numbers, start, end)
num = numbers[middle]
count = 0
for tmp in numbers:
if tmp == num:
count += 1
if count > middle:
return num
return 0
def partition(self, numbers, start, end):
key = numbers[start]
s = start
e = end
while s < e:
while numbers[e] >= key and s < e:
e -= 1
while numbers[s] <= key and s < e:
s += 1
if s < e:
numbers[s], numbers[e] = numbers[e], numbers[s]
numbers[start], numbers[s] = numbers[s], numbers[start]
return s
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: