小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
题目描述
给定一个大小为 n 的整数数组,找出其中所有出现超过
⌊ n/3 ⌋次的元素。
示例1 :
输入:[3,2,3]
输出:[3]
示例2:
输入:nums = [1]
输出:[1]
思路1:哈希
class Solution {
public List<Integer> majorityElement(int[] nums) {
int len=nums.length;
ArrayList<Integer> list = new ArrayList<>();
HashMap<Integer, Integer> map = new HashMap<>();
for(int i=0;i<len;i++){
if (map.containsKey(nums[i])){
Integer integer = map.get(nums[i]);
integer+=1;
map.put(nums[i],integer);
}else {
map.put(nums[i],1);
}
}
int Len=len/3;
for(Map.Entry<Integer,Integer> entry:map.entrySet()){
if (entry.getValue()>Len){
list.add(entry.getKey());
}
}
return list;
}
}
思路2:摩尔投票法
每次剔除不同的三个数,最后剩下的一个或者两个不同的数一定存在"众数"(众数存在的情况下)。
class Solution {
public List<Integer> majorityElement(int[] nums) {
int[][] res=new int[2][2];
List<Integer> list=new ArrayList<>();
res[0][0]=nums[0];
res[0][1]=1;
int i=1;
for(;i<nums.length;i++){
if(nums[i]!=res[0][0]){
res[1][0]=nums[i];
res[1][1]=1;
i++;
break;
}else{
res[0][1]+=1;
}
}
if(res[1][1]==0){
list.add(res[0][0]);
return list;
}
for(;i<nums.length;i++){
if(nums[i]!=res[0][0] && nums[i]!=res[1][0]){
if(res[0][1]==0){
res[0][0]=nums[i];
res[0][1]=1;
}else if(res[1][1]==0){
res[1][0]=nums[i];
res[1][1]=1;
}else{
res[0][1]-=1;
res[1][1]-=1;
}
}else if(nums[i]==res[0][0]){
res[0][1]+=1;
}else if(nums[i]==res[1][0]){
res[1][1]+=1;
}
}
res[1][1]=0;
res[0][1]=0;
for(int j=0;j<nums.length;j++){
if(nums[j]==res[0][0]){
res[0][1]+=1;
}
if(nums[j]==res[1][0]){
res[1][1]+=1;
}
}
if(res[0][1]>nums.length/3){
list.add(res[0][0]);
}
if(res[1][1]>nums.length/3){
list.add(res[1][0]);
}
return list;
}
}