我在字节跳动一面碰到了这个问题,面试官示意用Map实现,复杂度O(n)。
//思路:用Map的Key存元素,Value存出现次数
import java.util.HashMap;
import java.util.Map;
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
Map<Integer,Integer> map=new HashMap<>();
for(int i=0;i<array.length;i++){
if(!map.containsKey(array[i]))
map.put(array[i],1);
else{
int count=map.get(array[i])+1;
map.put(array[i],count);
}
}
for(int key:map.keySet()){
if(map.get(key)>array.length/2)return key;
}
return 0;
}
}
//测试类
public class MoreThanHalf{
public static void main(String[] args) {
int []arr=new int[]{2,1,1,2,1,1,3};
int res=moreThanHalf(arr);
//输出 1
System.out.println(res);
}
}
//后续更新:Moore投票法实现更简单
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
int count=0;
int val=Integer.MIN_VALUE;
for(int n:array){
if(count==0)
val=n;
if(val==n)count++;
else
count--;
}
//再次遍历确认是否存在众数
count=0;
for(int n:array)
if(n==val)
count++;
return count>array.length/2?val:0;
}
}