剑指offer学习笔记:39数组中出现次数超过一半的数字
作者:互联网
题目
解法1
排序居中法:
通过分析可以得出,将该数组排序,最中间的那个值一定是出次数最多的那个数。分析出这个信息我们就好写代码了,时间复杂度为排序的复杂度O(nlogn),空间复杂度O(1)
class Solution:
def majorityElement(self, nums: List[int]) -> int:
nums.sort()
return nums[len(nums)//2]
解法2
哈希表法:
在遍历的过程中统计每个数出现的次数,当该次数超过数组长度的一半,就直接发挥该key值。时间复杂度O(n),空间复杂度O(n)。相比上一个方法,很典型的用空间换时间
class Solution:
def majorityElement(self, nums: List[int]) -> int:
count_dict = {}
mid = len(nums)//2
for inum in nums:
if inum not in count_dict:
count_dict[inum] = 1
else:
count_dict[inum] +=1
if count_dict[inum] > mid:
return inum
return nums[mid] #上述的return有可能执行不到,也就是数组没有重复的元素,而题目描述应该可以想到是[1]这种,循环外处理
解法3
摩尔计数法:
关于该方法的题目描述可以参考,摩尔投票题解
对于摩尔计数的理解,可以参考:
class Solution:
def majorityElement(self, nums: List[int]) -> int:
votes = 0 #票数
for inum in nums:
if votes == 0: #如果票数为0说明前面已经抵消完成,设置当前的值为众数
major = inum
if inum != major: #不等票数减1
votes-=1
else: #相等票数加1
votes+=1
return major
标签:39,return,nums,int,复杂度,offer,笔记,dict,inum 来源: https://blog.csdn.net/qq_32395669/article/details/115046434