剑指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
相关文章推荐
- 剑指offer 面试题29—数组中出现次数超过一半的数字
- 剑指Offer----面试题29:数组中出现次数超过一半的数字
- 【剑指Offer学习】【面试题29 :数组中出现次数超过一半的数字】
- 【剑指Offer】面试题29:数组中出现次数超过一半的数字
- 【剑指offer-Java版】29数组中出现次数超过一半的数字
- 剑指offer-面试题29 找到数组中出现次数超过一半的数字-1
- 剑指offer-题29:数组中出现次数超过一半的数字
- 剑指offer-29数组中出现次数超过一半的数字
- 剑指offer--面试题29:数组中出现次数超过一半的数字
- 剑指Offer之面试题29:数组中出现次数超过一半的数字
- 【面试题】剑指offer29--数组中出现次数超过一半的数字
- 剑指offer之面试题29:数组中出现次数超过一半的数字
- 剑指offer-29:数组中出现次数超过一半的数字
- 剑指Offer29数组中出现次数超过一半的数字
- 【剑指offer】5.2时间效率——面试题29:数组中出现次数超过一半的数字
- 剑指offer面试题29-数组中出现次数超过一半的数字
- 剑指offer 29题 【时间效率】数组中出现次数超过一半的数字
- 【剑指offer】面试题29:数组中出现次数超过一半的数字
- 剑指offer面试题[29]-数组中出现次数超过一半的数字
- 剑指Offer:面试题29——数组中出现次数超过一半的数字(java实现)