算法思想一:哈希表
解题思路:
出现次数最多的元素大于 n/2 次,所以可以用哈希表来快速统计每个元素出现的次数
1、使用哈希映射来存储每个元素以及出现的次数。对于哈希映射中的每个键值对,键表示一个元素,值表示该元素出现的次数。
2、用一个循环遍历数组 nums 并将数组中的每个元素加入哈希映射中。在添加到哈希表中时判断该数字出现的次数是否大于 n/2,是则直接返回该数字,否则继续遍历
1、使用哈希映射来存储每个元素以及出现的次数。对于哈希映射中的每个键值对,键表示一个元素,值表示该元素出现的次数。
2、用一个循环遍历数组 nums 并将数组中的每个元素加入哈希映射中。在添加到哈希表中时判断该数字出现的次数是否大于 n/2,是则直接返回该数字,否则继续遍历
图解:
代码展示:
Python版本
# -*- coding:utf-8 -*- class Solution: def MoreThanHalfNum_Solution(self, numbers): # write code here # 特殊情况 if not numbers: return None if len(numbers) == 1: return numbers[0] # 哈希表 set = {} # 遍历数字,存储记录数组中每个数字出现的次数 for i in numbers: if i not in set: set[i] = 1 else: set[i] += 1 # 判断数字出现的次数是否符合题目要求 if set[i] > (len(numbers) / 2): return i return None
复杂度分析
时间复杂度:O(n),其中 n 是数组 numbers 的长度。最差情况下遍历数组 numbers一次,对于 numbers中的每一个元素,将其插入哈希表都只需要常数时间空间复杂度:O(n)。哈希表最多包含 n-n/2 个键值对,所以占用的空间为 O(n)。
算法思想二:排序
解题思路:
如果将数组 array 中的所有元素按照单调递增或单调递减的顺序排序,那么下标为 n/2 的元素(下标从 0 开始)一定是众数。 对于n为奇数或者偶数的情况,数组下面的线表示如果众数是数组中的最小值时覆盖的下标,数组下面的线表示如果众数是数组中的最大值时覆盖的下标。对于其他的情况,这条线会在这两种极端情况的中间。对于这两种极端情况,它们会在下标为 n/2 的地方有重叠。因此,无论众数是多少,返回 n/2 下标对应的值都是正确的。
实例:
array = [2,1,2,3,2,2]
重新排序后的数组 array = [1,2,2,2,2,3]
新的数组中间数字的索引为 3,且对应的数字 2 的长度为4
代码展示:
JAVA版本
import java.util.Arrays; public class Solution { public int MoreThanHalfNum_Solution(int [] array) { // 数组排序 Arrays.sort(array); // 返回数组中间的数字 return array[array.length / 2]; } }
复杂度分析
时间复杂度:O(nlogn)。将数组排序的时间复杂度为 O(nlogn)。空间复杂度:O(logn)。如果使用语言自带的排序算法,需要使用 O(logn) 的栈空间。如果自己编写堆排序,则只需要使用 O(1) 的额外空间。