题目:
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例:
输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2
思考:
-
方法一:投机取巧
-
将数组排序,出现次数超过一半的数字肯定在数组中间的那个位置
题解:
java
class Solution {
public int majorityElement(int[] nums) {
Arrays.sort(nums);
return nums[nums.length / 2];
}
}
思考:
-
方法二:哈希表辅助
-
使用一个 map,key 存数组中的数字,val 存出现的次数
-
当有数字出现次数超过数组长度一半时,直接返回
题解:
java
class Solution {
public int majorityElement(int[] nums) {
Map<Integer,Integer> map = new HashMap<>();
for(int num : nums){
map.put(num,map.getOrDefault(num,0)+1);
if(map.get(num)> nums.length>>1) return num;
}
return 0;
}
}
思考:
-
方法三,摩尔投票法
-
众数和非众数投票,初始票数为 0,为 0 时假设当前数字为众数
-
遍历数组,是众数 +1,不是众数 -1,为 0 就接着继续重新来
-
最后得到众数
题解:
java
class Solution {
public int majorityElement(int[] nums) {
int vote = 0;
int x = 0;
for (int i = 0; i < nums.length; i++) {
if (vote == 0) x = nums[i];
if (x == nums[i]) vote++;
else vote--;
}
return x;
}
}