剑指offer二刷——数组专题——数组中出现次数超过一半的数字
Posted olebaba
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer二刷——数组专题——数组中出现次数超过一半的数字相关的知识,希望对你有一定的参考价值。
题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为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)
以上是关于剑指offer二刷——数组专题——数组中出现次数超过一半的数字的主要内容,如果未能解决你的问题,请参考以下文章