给定一个大小为 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、使用map记录<元素,出现次数>
如果次数超过n/2 即为要查找的元素
import java.util.HashMap;
import java.util.Map;
public class MajorityNumber {
public static void main(String[] args){
int[] nums={2,2,1,1,1,2,2};
System.out.println(majorityElement(nums));
}
public static int majorityElement(int[] nums){
Map<Integer,Integer> map=new HashMap<>();
int halfLen= nums.length/2;
for (int i = 0; i < nums.length; i++) {
int num = nums[i];
//元素次数 初始化是1
int count=1;
if(map.containsKey(num)){
count=map.get(num);
count++;
}
if(count>halfLen){
return num;
}
System.out.println(num+"元素,存储次数为 "+count);
map.put(num,count);
}
return -1;
}
}
结果:
2、排序后取中间值
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public static int majorityElement1(int[] nums){
Arrays.sort(nums);
System.out.println(Arrays.toString(nums));
int halfLen=nums.length/2;
return nums[halfLen];
}
}
结果:
3、投票算法
将元素当做候选人,如果新元素和候选人相同,次数+1,不同次数-1(代表抵消)如果次数=0,候选人更新。
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public class MajorityNumber {
public static void main(String[] args){
int[] nums={2,2,1,1,1,2,2};
//System.out.println(majorityElement(nums));
//System.out.println(majorityElement1(nums));
System.out.println(majorityElement2(nums));
}
public static int majorityElement2(int[] nums){
int candidate=-1;
int count=0;
for (int i = 0; i < nums.length; i++) {
if(count==0){
candidate=nums[i];
}
if(candidate==nums[i]){
count++;
}else {
count--;
}
System.out.println("元素"+nums[i]+"次数"+count+",候选人"+candidate);
}
return candidate;
}
}
结果: