题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为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.length==0){
return 0;
}
quickSort(array,0,array.length-1);
int count=0;
for(int i=0;i<array.length;i++)
if(array[i]==array[array.length/2])
count++;
if(count>(array.length)/2)
return array[array.length/2];
else return 0;
}
private void quickSort(int [] array,int start,int end){
if(start>=end)
return;
int i=start;
int j=end;
while(i<j){
while(array[j]>=array[start]&& i<j)
j--;
while(array[i]<=array[start]&& i<j)
i++;
swap(array,i,j);
}
swap(array,start,j);
quickSort(array,start,j-1);
quickSort(array,j+1,end);
}
private void swap(int [] array,int i,int j){
int temp=array[i];
array[i]=array[j];
array[j]=temp;
}
}
使用数组特点:
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
if(array.length==0)
return 0;
int time=1;
int num=array[0];
for(int i=1;i<array.length;i++){
if(time==0){
num=array[i];
time=1;
continue;
}
if(array[i]==num)
time++;
else
time--;
}
if(time==0)
return 0;
else{
time=0;
for(int i=0;i<array.length;i++){
if(array[i]==num)
time++;
}
if(time*2>array.length)
return num;
else
return 0;
}
}
}
哈希表法:
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
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]);
map.put(array[i],++count);
}
}
Iterator iter = map.entrySet().iterator();
while(iter.hasNext()){
Map.Entry entry = (Map.Entry)iter.next();
Integer key =(Integer)entry.getKey();
Integer val = (Integer)entry.getValue();
if(val>array.length/2){
return key;
}
}
return 0;
}
}