160. 169. 多数元素/面试题39. 数组中出现次数超过一半的数字(简单)

给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例 1:

输入: [3,2,3]
输出: 3

示例 2:

输入: [2,2,1,1,1,2,2]
输出: 2

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/majority-element

思路1:

摩尔投票法:

Boyer-Moore 算法的本质和方法四中的分治十分类似。我们首先给出 Boyer-Moore 算法的详细步骤:

我们维护一个候选众数 candidate 和它出现的次数 count。初始时 candidate 可以为任意值,count 为 0;

我们遍历数组 nums 中的所有元素,对于每个元素 x,在判断 x 之前,如果 count 的值为 0,我们先将 x 的值赋予 candidate,随后我们判断 x:

  • 如果 x 与 candidate 相等,那么计数器 count 的值增加 1;

  • 如果 x 与 candidate 不等,那么计数器 count 的值减少 1。

在遍历完成后,candidate 即为整个数组的众数。

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/majority-element/solution/duo-shu-yuan-su-by-leetcode-solution/

摩尔投票法的核心思想就是抵消

玩一个诸侯争霸的游戏,假设你方人口超过总人口一般以上,并且能保证每个人都能一对一同归于尽。最后还有人活下来的国家就是胜利。大混战,最差所有人都联合起来对付你(对应你每次选择作为计数器的数都是众数),或者其他国家也会相互攻击(会选择其他数字作为计数器的数),但是只要你们不内斗,最后肯定你赢

代码1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public int majorityElement(int[] nums) {
if(nums == null || nums.length==0)
return 0;
int candiate = 0;
int count = 0;
for(int num:nums){
if(count==0)
candiate = num;
//判断num是否和candidate相等
count += (candiate ==num)?1:-1;
}
return candiate;
}
}