题目
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。
示例
示例 1:
输入: [3,2,3]
输出: 3
示例 2:
输入: [2,2,1,1,1,2,2]
输出: 2
思路
思路一
这题不多说,经典的解法就是暴力法,利用map存贮数值的数量,代码如下:
public int majorityElement(int[] nums) {
if (nums == null){
return -1;
}
HashMap<Integer,Integer> map=new HashMap<>();
for (int i=0; i<nums.length; i++){
if (map.get(nums[i]) == null){
map.put(nums[i],1);
}else {
int temp=map.get(nums[i]);
map.put(nums[i],++temp);
}
}
Set<Integer> keySet=map.keySet();
Iterator<Integer> iterator=keySet.iterator();
while (iterator.hasNext()){
int key=iterator.next();
int value=map.get(key);
if (value > nums.length/2){
return key;
}
}
return -1;
}
思路二
采用摩尔投票法,遇到相同的值加1,不同的减1,计数为0则换一个数字,由于其题目中众数是指在数组中出现次数大于 ⌊ n/2 ⌋
的元素。所以总能用这种方式找出众数,照这样空间复杂度就为O(1)
了,代码如下:
public int majorityElement(int[] nums) {
if (nums == null){
return -1;
}
int target=nums[0];
int count=1;
for (int i=1; i<nums.length; i++){
if (target != nums[i]){
count--;
if (count == 0){
target=nums[i+1];
}
}else {
count++;
}
}
return target;
}