剑指offer二刷——数组专题——数组中出现次数超过一半的数字

2021-04-02 22:25

阅读:662

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

我的理解

找到数组中超过一半的数,即众数。设置一个变量tmp保存当前假设认为是众数的数,设置cnt保存tmp未被抵消的次数。遍历数组,若当前数字不是tmp,则cnt--;若当前数字是tmp,则cnt++;若cnt=0,则tmp换成下一个数字。

这是时间复杂度为O(n),空间复杂度O(1)的最优解。

# -*- coding:utf-8 -*-
class Solution:
    def MoreThanHalfNum_Solution(self, numbers):
        # write code here
        tmp = -1
        cnt = 0
        for i in range(len(numbers)):
            if cnt==0:
                tmp = numbers[i]
                cnt+=1
            else:
                if numbers[i]==tmp:
                    cnt+=1
                else:
                    cnt-=1
        sum=0
        for k in numbers:
            if k==tmp: sum+=1
        if sum >= len(numbers)/2+1:
            return tmp
        else:return 0

  

解法二 排序

将数组排序,然后找到众数

时间复杂度O(nlogn)

空间复杂度O(1)

解法三 哈希

为数组建立一个字典,遍历数组,得出每个数字出现的次数。

时间复杂度O(n)

空间复杂度O(n)

 

 

 

 

 

 


评论


亲,登录后才可以留言!