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

来源:互联网 发布:淘宝网1 8米纯棉床罩 编辑:程序博客网 时间:2024/06/11 19:09

题目描述

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

思路

  1. 如果某个数符合条件,它一定是中位数。因此,找出中位数。
  2. 如果一个数num,左边比它小,右边比它大,它的下标是index。如果index < middle,那么中位数在它右边,反之,中位数在它左边。
  3. 通过partition,下标为middle的值,它就是中位数。
  4. 根据中位数,判断是否符合条件。

代码

# -*- 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
阅读全文
0 0
原创粉丝点击