题目描述:
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
思路解析:
思路1:时间复杂度O(n),方法是:记录数组中的数字,和对应的次数,如果下一个数字跟他一样,那么次数加1,否则次数减1。如果次数是0的时候,就新记录一个数字,继续循环判断。也就是不一样的两个数字不会被我们记录(像是删除掉),最后剩下的数字是我们要找的。但是注意要进行验证,验证方法是记录找到的数字次数都是几,如果次数×2小于等于数组长度那就不是。
思路2:时间复杂度为O(n)遍历数组,利用hashmap记录每个数字以及数字出现的次数。
代码1:
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
int len=array.length;
if(len==0){
return -1;
}
int findNum =0;
int count=0;
for(int i=0;i<len;i++){
if(count==0){
findNum=array[i];
count=1;
}else if(findNum==array[i]){
count++;
}else{
count--;
}
}
if(!checkMoreThanHalf(array,findNum))
findNum=0;
return findNum;
}
public boolean checkMoreThanHalf(int[] array,int findNum){
int num=0;
for(int i=0;i<array.length;i++){
if(array[i]==findNum){
num++;
}
}
boolean isMoreThanHalf = true;
if(num*2<=array.length){
isMoreThanHalf = false;
}
return isMoreThanHalf;
}
}
代码2:
import java.util.*;
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
if(array==null||array.length==0){
return 0;
}
HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
for(int i=0;i<array.length;i++){
if(map.get(array[i])!=null){
map.put(array[i],map.get(array[i])+1);
}else{
map.put(array[i],1);
}
if(map.get(array[i])>array.length/2){
return array[i];
}
}
return 0;
}
}