牛客题霸NC73数组中出现次数超过一半的数字Java题解
https://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163?tpId=117&&tqId=34995&rp=1&ru=/ta/job-code-high&qru=/ta/job-code-high/question-ranking
方法1:摩尔投票法
解题思路:假设数组首个元素为众数,遍历并统计票数,设众数的票数为1,非众数的票数为-1。当发生票数和为0时,令当前的数字为众数继续遍历数组,当遍历完数组后,最后一次被作为众数的那个数就是数组真正的众数。
public class Solution { public int MoreThanHalfNum_Solution(int [] array) { int votes = 0; int count = 0; int res = 0; for(int num : array){ //遍历数组中的每个数字 if(votes == 0){ //当票数votes等于0,则将当前数字num作为众数 res = num; } votes+=(num==res?1:-1); //如果当前数字num等于众数,则票数votes自增1,否则票数自减1 } for(int num :array){ //统计众数出现的次数 if(num == res){ count++; } } if(count>array.length/2){ //判断众数出现的次数是否操作数组长度的一半 return res; }else{ return 0; } } }
方法2:HashMap
解题思路:利用HashMap统计数组中每个数字出现的次数,出现次数超过数组一半的那个数就是数组的众数。
import java.util.*; public class Solution { public int MoreThanHalfNum_Solution(int [] array) { HashMap<Integer,Integer> map = new HashMap<>(); for(int a : array){ //遍历数组array if(!map.containsKey(a)){ //如果map中不包含值为a的key,那么将(a,1)添加到map中 map.put(a,1); }else{ //如果map中包含值为a的key,那么将key为a的val加1 int val = map.get(a); val++; map.put(a,val); } } for(int i:array){ //找出出现次数超过一半的数,返回 if(map.get(i)>array.length/2){ return i; } } return 0; } }
方法3:数组排序
解题思路:将数组按从小到大的顺序排序,中间的那个数就是众数。
import java.util.*; public class Solution { public int MoreThanHalfNum_Solution(int [] array) { Arrays.sort(array); //将数组按从小到大的顺序排序 int res = array[array.length/2]; //位于数组中间的那个数就是众数 int count=0; for(int i :array){ //统计众数出现的次数 if(res == i){ count++; } } if(count>array.length/2){ //如果众数出现的次数超过数组长度的一半,则返回 return res; } return 0; } }