基于Partition函数的O(n)方法
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {if(array==null||array.length==0)
return 0;
int middle=array.length>>1;
int start=0;
int end=array.length-1;
int index=Partition(array,start,end);
while(index!=middle){
if(index>middle){
end=index-1;
index=Partition(array,start,end);
}
else{
start=index+1;
index=Partition(array,start,end);
}
}
int result=array[middle];
if(!CheckMoreThanHalf(array,result))
result=0;
return result;
}
public static boolean CheckMoreThanHalf(int array[],int number){
int times=0;
for(int i=0;i<array.length;++i){
if(array[i]==number)
times++;
}
boolean isMoreThanHalf=true;
if(times*2<=array.length){
isMoreThanHalf=false;
}
return isMoreThanHalf;
}
public int Partition(int array[],int start,int end){
int pivotkey=(int)start+(int)Math.random()*(end-start);
while(start<end){
while(start<end&&array[end]>=array[pivotkey])
end--;
swap(array,start,end);
while(start<end&&array[start]<=array[pivotkey])
start++;
swap(array,start,end);
}
return start;
}
public void swap(int[] array,int num1,int num2){
int temp =array[num1];
array[num1] =array[num2];
array[num2] =temp;
}
}
方法二:根据数组特点找出O(n)的算法
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
int length=array.length;
if(array==null||length<=0){
return 0;
}
int result=array[0];
int times=1;
for(int i=1;i<length;i++){
if(times==0){
result=array[i];
times=1;
}else{
if(array[i]==result){
times++;
}else{
times--;
}
}
}
times=0;
for(int i=0;i<length;i++){
if(result==array[i]){
times++;
}
}
if(times*2<=length){
result=0;
}
return result;
}
}