剑指offer学习笔记:39数组中出现次数超过一半的数字

题目

剑指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

摩尔计数法:
关于该方法的题目描述可以参考,摩尔投票题解
对于摩尔计数的理解,可以参考:
剑指offer学习笔记:39数组中出现次数超过一半的数字

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
上一篇:hadoop入门(5):了解hadoop


下一篇:Linux 删除乱码文件及文件夹