求众数
题目
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。
示例 1:
输入: [3,2,3]
输出: 3
示例 2:
输入: [2,2,1,1,1,2,2]
输出: 2
思路
- 暴力法,遍历数组,依次记录每个数字出现的次数,然后再遍历次数给出结果
- 先排序,数组中间的数字一定是众数,排序可以使用快排
- 摩尔投票法.此法必须用于在必定存在众数的情况下.简而言之,将数组第一个数作为过半数,然后将计数器设置为1,依次遍历,如果下一个数和当前数相同,则加一,反之减一.当计数器为0时更换下一个数为过半数.
代码
- 暴力法不写代码
- 先排序,再找众数(应该使用快排,此处省略)
class Solution {
public int majorityElement(int[] nums) {
Arrays.sort(nums);
return nums[nums.length/2];
}
}
- 摩尔投票法
class Solution {
public int majorityElement(int[] nums) {
int result = nums[0];
int sum = 1;
for(int i = 1;i < nums.length;i++){
if(result == nums[i]){
sum++;
}else{
sum--;
if(sum == 0){
result = nums[i];
sum++;
}
}
}
return result;
}
}