求众数
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。
示例 1:
输入: [3,2,3]
输出: 3
示例 2:
输入: [2,2,1,1,1,2,2]
输出: 2
1、第一种解法(利用HashMap进行计数)
思路:首先利用HashMap进行计数,然后在遍历找出value值最大的key。key即是众数。
时间复杂度是o(n)。
代码;
public int majorityElement(int[] nums) {
HashMap<Integer,Integer> map = new HashMap<>();
for(int x:nums){
Integer COUNT = map.get(x);
if(map.get(x) == null)
map.put(x, 1);
else
map.put(x, ++COUNT);
}
int max = 0;
int rst = 0;
for(Map.Entry<Integer,Integer> entry : map.entrySet()){
int curr = entry.getValue();
if(curr > max){
max = curr;
rst = entry.getKey();
}
}
return rst;
}
2、第二种解法(摩尔投票法)
思路:首先令出现次数count=1,众数值maj=nums[0]为数组第一个元素。从索引1开始遍历,之后若遇到相同的值,则 ++count。遇到不同的值则–count,如果count变成零,则maj变成maj=nums[i+1]。
时间复杂度是o(n)。
代码:
public int majorityElement(int[] nums) {
int maj = nums[0];
int count = 1;
for(int i=1; i < nums.length; i++){
if(maj == nums[i])
++count;
else{
--count;
if(count == 0)
maj = nums[i+1];
}
}
return maj;
}