方法1 HashMap
思想 :
利用HashMap计算每一次数组元素出现的次数,然后在判断这个数是不是众数(看有没有超过数组元素的一半)
代码实现:
import java.util.*;
public class Solution {
public int MoreThanHalfNum_Solution (int[] numbers) {
Scanner scanner = new Scanner(System.in);
HashMap<Integer,Integer> map = new HashMap<>();
int len = numbers.length;
for(int x : numbers) {
map.put(x,map.getOrDefault(x,0)+1);
}
int max = 0;
for(int x : numbers) {
if(map.get(x) > len/2) {
max = x;
}
}
return max;
}
}
方法2 排序
思想:
将数组进行排序,如果存在众数,说明中间的数就是众数 不存在返回0;
代码实现
public class Solution {
public int MoreThanHalfNum_Solution (int[] numbers) {
if(numbers == null || numbers.length == 0) {
return 0;
}
Arrays.sort(numbers);
int len = numbers.length;
int midNum = numbers[len/2];
int time = 0;
for(int i = 0; i < len; i++) {
if(numbers[i] == midNum) {
time++;
}
}
if(time > len/2) {
return midNum;
}
return 0;
}
}
方法3 消除(加分思路)
思想:
利用众数 和 非众数相互抵消 ,如果两个数不相等,就消除这两个数
如果众数存在,最后留下的数一定是众数
代码实现
import java.util.*;
public class Solution {
public int MoreThanHalfNum_Solution (int[] numbers) {
if(numbers == null || numbers.length == 0) {
return 0;
}
int len = numbers.length;
int res = numbers[0];
int time = 1;
//记录下标0的值,以及出现的次数1;
//如果如果后面出值相同则次数加一,不同减一
for(int i = 1; i < len; i++) {
if(time != 0) {
if(numbers[i] == res) {
time++;
} else {
time--;
}
//time == 0 说明这个数出现次数被抵消完了,
//将当前的下标元素赋值给res,次数重新计算
} else {
res = numbers[i];
time = 1;
}
}
int count = 0;
for(int i = 0; i < len; i++) {
if(numbers[i] == res) {
count++;
}
}
// 判断是不是众数
if(count > len/2) {
return res;
}
return 0;
}
}
标签:return,int,众数,len,次数,三种,numbers,数组,time
From: https://blog.51cto.com/u_16166203/7094614