算法思想一:哈希表

解题思路:

出现次数最多的元素大于 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) 的额外空间。