LeetCode 169. Majority Element [Easy]
题目来源:https://leetcode.com/problems/majority-element
题目难度:Easy
解答1[Java](Boyer-Moore Voting Algorithm)
1 | class Solution { |
分析
这个算法叫做摩尔投票法(Boyer-Moore Voting Algorithm)。
选定一个数,遇到相同的就加1,不同就减1,count 变成 0 就换下一个数,因为众数占总体的一半以上,所以众数总能脱颖而出。
时空复杂度
时间复杂度:$O(n)$
空间复杂度:$O(1)$
解答2[Java]
1 | class Solution { |
分析
因为众数的数量大于 $\lfloor n/2 \rfloor$,则众数的数量最小为 $\lfloor n/2 \rfloor + 1$。
如果我们对数组进行排序,有三种情况:
① 假设众数比所有数都小,则众数将占据排序后数组的左半部分。
② 如果众数比所有数都大,则众数将占据排序后数组的右半部分。
③ 如果数组不是最大的也不是最小的,众数将占据排序后数组的中间部分。
不管哪一种情况,排序后的数组中的第 $\lfloor n/2 \rfloor + 1$ 个位置上的数一定是众数。
时空复杂度
时间复杂度:$O(nlogn)$,本算法的主要开销在排序上,因此时间复杂度就是快速排序的时间复杂度。
空间复杂度:$O(1)$