您的位置:首页 > 职场人生

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

2017-06-23 15:02 246 查看
基于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++;                 

         
4000
      }else{                    

                    times--;                 

                }             

            }         

        }  

        times=0;         

        for(int i=0;i<length;i++){            

            if(result==array[i]){    

                times++;             

            }        

        }          

        if(times*2<=length){            

            result=0;  

         }        

        return result;     

    } 

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: