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

题目:

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

思路1:

先排序,统计次数,超过一半就停止循环。
这里用sorted()排序,在做笔试的题的时候很快,但是在面试的时候,面试官会希望你排序的内容也要写出来,那么排序最快也得O(nlogn),算法的复杂度就高了。因此,该方法只在想不出优化的时候用,推荐后面的解法。

class Solution:
     def MoreThanHalfNum_Solution(self, numbers):
        # write code here
        if (len(numbers) == 0):
            return 0
        halflen = len(numbers) / 2
        numbers = sorted(numbers)
        i = 0
        count = 1
        while (i < len(numbers)):
            if ((i + 1 <= (len(numbers) - 1) and numbers[i] == numbers[i + 1] )):
                count = count + 1
                if (count > halflen):
                    return numbers[i]
            else:
                if (count > halflen):
                    return numbers[i]
                else:
                    count = 1
            i = i + 1
        return 0

思路2:

首先题干说明找的数一定存在,那么数的个超过了数组的一半,数组最中间的数一定是我们找的数,所以该问题等于找一个数组的中位数。接下来考虑如何找中位数。
利用partition的思想
快排的核心方法是Partition函数,它的作用就是将整个数组分成小于基准值的左边,和大于基准值的右边。
那么对于数组,随机选取一个数,比它小的放左边,比它大的放右边,如果该数的下标刚好为n/2,该数就是中位数。如果下标

思路3:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值