给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋
次的元素。
示例 1:
输入:nums = [3,2,3] 输出:[3]
示例 2:
输入:nums = [1] 输出:[1]
示例 3:
输入:nums = [1,2] 输出:[1,2]
方法一:使用HashMap,key记录值,value记录出现次数
class Solution {
public List<Integer> majorityElement(int[] nums) {
Map<Integer,Integer>map=new HashMap<>();
for(int x:nums){
map.put(x,map.getOrDefault(x,0)+1);
}
int n=nums.length;
int t=n/3;
List<Integer> list=new ArrayList<>();
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
if(entry.getValue()>t){
list.add(entry.getKey());
}
}
return list;
}
}
方法二:使用摩尔投票:一个数组中出现次数要大于总数的三分之一,满足条件的最多也只有两个数
class Solution {
public List<Integer> majorityElement(int[] nums) {
int a=nums[0];
int a1=0;
int b=nums[0];
int b1=0;
for(int x:nums){
if(x==a){
a1++;
}else if(x!=a&&x!=b&&b1==0){
b=x;
b1++;
}else if(x!=a&&x!=b&&a1==0){
a=x;
a1++;
}else if(x!=a&&x!=b){
a1--;
b1--;
}else if(x==b){
b1++;
}
}
List<Integer>list=new ArrayList<>();
a1=0;
b1=0;
for(int x:nums){
if(x==a) a1++;
else if(x==b) b1++;
}
int t=nums.length/3;
if(a1>t){
list.add(a);
}
if(b1>t){
list.add(b);
}
return list;
}
}