question:
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
解法一:遍历消除
思路: 假如一个数的个数大于数组的长度一半,当此数与其他数不同时抵消那么抵消后必定会存在未被抵消的数。
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
if(array==null||array.length==0) return 0;
int count=1;
int result=0;
for(int i=1;i<array.length;i++){
if(count==0){
result=i;
count=1;
continue;
}else if(array[i]==array[result]){
count++;
}else{
count--;
}
}
//不用想太多,管他是什么result可能是结果也可能不是再重新遍历一遍就知道了
count=0;
for(int i=0;i<array.length;i++){
if(array[i]==array[result]) count++;
}
if(count>array.length/2) return array[result];
return 0;
}
}
解法二:借助map查找
import java.util.*;
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
if(array==null||array.length==0) return 0;
Map<Integer,Integer> map = new HashMap<>();
int max = 0;
for(int i=0;i<array.length;i++){
int tmp = array[i];
if(map.containsKey(tmp)){
int count = map.get(tmp);
map.replace(tmp,count,count+1);
if(map.get(array[max])<(count+1)) max = i;
}else{
map.put(tmp,1);
}
}
if(map.get(array[max])>array.length/2) return array[max];
return 0;
}
}
解法三:排序后查找
思路: 好理解
import java.util.*;
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
if(array==null||array.length==0) return 0;
Arrays.sort(array);
int temp = array[array.length/2];
int count = 0;
for(int i=0;i<array.length;i++){
if(temp==array[i]){
count++;
}
}
if(count>array.length/2) return temp;
return 0;
}
}