面试题29:数组中出现次数超过一半的数字

来源:互联网 发布:80端口和8080端口区别 编辑:程序博客网 时间:2024/06/05 20:26

基于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;     
    } 
}

阅读全文
0 0
原创粉丝点击