オファーの流暢はシリーズを受賞 - より多くの回数の半分以上の配列を出現数

フェイス質問39:配列を出現数倍の数の半分以上

一つ、タイトル説明

この番号を見つけ、配列の半分以上の長さを表示される配列番号の数があります。そのような長さ{1、2、3、2、2、2、5、4、2}のアレイの入力として9。数2は5回、アレイ内のアレイの半分以上の長さ、出力2が表示されているので。

第二に、問題分析

私たちは、その後、デジタルの配列の中央を発注後の数は必ずしもを求め、最も可能性の高いアイデアがデジタルの半分よりも数だと思うしています。

それはソート関与する配列であるため、彼らは通常、古典的またはランダムクイックソートクイックソートを選択してください。その影響は、ステータスデータを縮小ように、各アレイからのクイックソートランダム基礎をランダムに選択された分割されているので、時間計算量はO(N * logN個)、影響を受けたデータの迅速な選別条件、時間複雑さの差であります次いで、O(N ^ 2)です。本明細書で使用する場合、それはより便利に書き込み、クイックソートです。

実際には、もっと面白い、だけでなく、アルゴリズムの非常に良いアイデアがあり、攻撃と守備位置のアイデアとして記述されています。

第一个数字作为第一个士兵,守阵地;count = 1;
遇到相同元素,count++;
遇到不相同元素,即为敌人,同归于尽,count--;当遇到count为0的情况,又以新的i值作为守阵地的士兵,继续下去,到最后还留在阵地上的士兵,有可能是主元素。
再加一次循环,记录这个士兵的个数看是否大于数组一般即可。

回数以上の数字の合計よりも表示され、他の数:それは、デジタルの半分以上の数であり、

アレイを介して2つの値の間に格納されている:配列で数、他の回数です。保存された数字の数プラス1、マイナス1とその逆と同じ場合場合は、次の番号へのトラバース。0の周波数は、次の番号が保存されている場合は、番号が1にリセットされます。もっと他の図よりも表示され、数字を探していることは確かに数が1番に設定されている最後の時間に番号を探している回数に起因します。

第三に、質問

思考(推奨されません)

    // 表示输入是否有效
    boolean isInputInvalid = true;
    // 快速排序
    public int MoreThanHalfNum(int [] array) {
        if(array==null ||array.length <= 0) {
            return 0;
        }
        int low=0;
        int high=array.length-1;
        int index=partition(array, low, high);

        while(index != array.length>>1){
            if(index < array.length>>1 ){
                low = index+1;
                index = partition(array,low,high);
            } else {
                high = index-1;
                index=partition(array,low,high);
            }
        }

        //判断次数是否超过一半
        int num=array[index];
        int times=0;
        for(int i=0;i < array.length;i++){
            if(array[i]==num){
                times++;
            }
        }
        if(times*2 > array.length){
            isInputInvalid=false;
            return num;
        }
        return 0;
    }

    private int partition(int[] array,int low ,int high){

        int pivotKey=array[low];
        while(low < high){
            while(low < high &&  array[high] >= pivotKey) {
                high--;
            }
            int temp=array[low];
            array[low]=array[high];
            array[high]=temp;
            while(low < high && array[low] <= pivotKey) {
                low++;
            }
            temp=array[low];
            array[low]=array[high];
            array[high]=temp;
        }
        return low;
    }

思考2​​(推奨)

	// 表示输入是否有效
    boolean isInputInvalid = true;

    public int MoreThanHalfNum(int [] array) {
        if(array==null || array.length <= 0) {
            return 0;
        }

        int num=array[0];
        int count = 1;
        for(int i=1;i<array.length;i++){
            if(count == 0) {
                num=array[i];
                count++;
            }
            else if(array[i] == num) {
                count++;
            }
            else {
                count--;
            }
        }
        
        if(count > 0){
            int times=0;
            for(int i=0;i<array.length;i++){
                if(array[i] == num){
                    times++;
                }
            }
            if(times*2 > array.length){
                isInputInvalid=false;
                return num;
            }
        }
        return 0;
    }
公開された158元の記事 ウォンの賞賛3221 ビュー46万+

おすすめ

転載: blog.csdn.net/qq_42322103/article/details/104109490