问题描述
给定一个数组,数组中有个元素的数量超过数组总数的一半,要求找出该元素。题目链接:点我
样例输入输出
输入:[3,2,3]
输出:3
输入:[2,2,1,1,1,2,2]
输出:2
问题解法
此题比较简单的做法是用 map 存储数字及其出现的次数,然后找出最大次数的元素即是求解的答案。另一种简单的做法是排序,然后返回中位数(因为目标元素出现了至少 n / 2次)。但是这两种解决都不能在 O(1) 的空间复杂度、O(n) 的时间复杂度内求解。
更优化的做法是使用Boyer-Moore 算法:先用 candidate 表示候选的数,用 count 表示当前候选数剩余的数量,遍历数组,如果当前元素和候选数相同,则 count + 1,否则 count - 1,如果 count 为零,则将当前元素赋值给 candidate,遍历结束后,count 值一定大于0,此时 candidate 的值就是求解的值。此算法可以换另一种理解,因为求解的值的数量超过一半,所以剩下的元素和目标元素进行抵扣消极后,目标元素仍然有剩余。代码如下
1  | class Solution {  |