LeetCode(169)多数元素
今天是小呆刷题的第 16 天,今天的题目是:力扣(LeetCode)的第 169 题,多数元素
题目要求
给定一个大小为
n
的数组nums
,返回其中的多数元素。多数元素是指在数组中出现次数大于⌊ n/2 ⌋
的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例:
1 |
|
提示:
n == nums.length
1 <= n <= 5 * 104
-109 <= nums[i] <= 109
解题思路
这道题小呆的第一思路就是用哈希表来解决,因为跟返回数组中出现次数最多的题的思路是一样的,只不过这道题是返回次数大于n/2
的那个元素。
1 |
|
习惯性的做完去评论区开拓视野,然后发现了这道题至少有 4 种解法,除了上面的哈希表,还可以用排序、摩尔投票、分治来解决,分治目前小呆还没接触过,所以直接跳过,等到学会分治算法之后再回过头来看这道题。其他两种题解分享一下,首先是排序:
1 |
|
其次是摩尔投票,摩尔投票的核心就是对拼消耗。评论区你我山巅自相逢
同学解释的挺好:
题目中我们需要查找的数字超过数组长度的一半,也就是说,要查找的数字 target 的个数会超过其他数字个数。
假设不同数字相互抵消,那么最后剩下的数字,就是我们要找的多数元素。
我们可以把这个过程打个比方,比如现在多军对峙,假设阵营 A 士兵人数比其他方的人数都多,阵营 A 士兵能以一杀一,那么只要阵营 A 士兵不杀自己人(相同数字),去杀不同阵营的人(不同数字),那么最后剩下的那些士兵,就是阵营 A 的士兵。
1 |
|
小结
今天又学到了一种新算法,摩尔投票法,收获满满!
引用
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 小呆&小萌的情侣博客!
评论