[剑指Offer]数组中出现次数超过一半的数字

题目描述

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

解题思路

  1. 直接遍历一遍数组,同时统计该数字出现的次数,大于一半就返回;
  2. 将该数组排序后,数组最中间的数字出现次数如果大于数组长度的一半,则为该数字,否则没有符合条件的数字。而该数字恰是排序数组的中位数。

代码

Python(2.7.3)

无脑遍历法

1
2
3
4
5
6
7
8
9
10
11
12
13
# -*- coding:utf-8 -*-
class Solution:
def MoreThanHalfNum_Solution(self, numbers):
# write code here
res = []
length = len(numbers) / 2
for i in numbers:
if i in res:
continue
res.append(i)
if numbers.count(i) > length:
return i
return False

运行时间:26ms
占用内存:5856k

中位数法

1
2
3
4
5
6
7
8
9
10
# -*- coding:utf-8 -*-
class Solution:
def MoreThanHalfNum_Solution(self, numbers):
# write code here
numbers_s = sorted(numbers)
length = len(numbers_s) / 2
median = numbers[int(length)]
if numbers_s.count(median) > length:
return median
return False

运行时间:34ms
占用内存:5636k