配列の出現回以上の数の半分より数:安全性を証明するために、

タイトル説明

この番号を見つけ、配列の半分以上の長さを表示される配列番号の数があります。例えば、入力アレイ9の長さ  {1,2,3,2,2,2,5,4,2}数2は5回、アレイ内のアレイの半分以上の長さ、出力2が表示されているので。0出力がある場合。

ソリューション

ソリューション

速い行のパーティションのアイデアを使用します。

配列番号の数は、アレイの半分以上の長さが表示され、その後、我々が探している番号必ずしもデジタルの列の真ん中に、ソートされました。我々は、ランダムに選択されたデジタル数字は、それの左側にランクされているよりも小さい数、使用パーティション()関数を選択し、選択されたデジタル数字は、それの右側にランクされているよりも大きいです。

選択された添字の数字の分析  index

  • 場合は  index = n/2、この数は中央値です。
  • 場合は  index > n/2、その後、左のインデックス内のパーティションが続きます。
  • 場合は  index < n/2、右のインデックスのパーティションを続けました。

**注:**この方法は、アレイ入力を修正します。時間の複雑さがあります  O(n)

 

パブリック クラスソリューション{ 
    
    パブリック 静的 INT MoreThanHalfNum_Solution(INT [] ARR){
         場合(ARR == NULL || arr.length == 0が){
             戻り 0 ; 
        } 
        INT N = arr.length。
        INT = 0、終了= N-1を開始しますint型ミッド= N >> 1 int型のインデックス= パーティション(ARR、開始、終了)。
        しばらく(インデックス!= MID){
             場合(インデックス> 中旬){ 
                終了 =インデックス-1; 
            } { 
                開始 =インデックス+1 
            } 
            インデックス = パーティション(ARR、開始、終了)。
        } 
        戻り?isMoreThanHalf(ARR、ARR [インデックス])ARR [インデックス]:0 
    } 
     

    プライベート 静的 ブール isMoreThanHalf(INT [] ARR、int型のval){
         int型の CNT = 0 INT E:ARR){
             もし、(E == ヴァル){ 
                CNT ++ 
            }
        }
        返す CNT * 2> arr.lengthを。
    } 

    プライベート 静的 int型のパーティション(INT [] ARR、int型開始、int型エンド){
         int型のp =のARR [END]。
        しながら(<開始端)を{
             ながら end--(<エンド&& ARR [終了]> = P起動)
            ARR [スタート] =のARR [END]。
            しながら(開始<エンド&& ARR [開始] <= P)++開始
            ARR [END] = ARR [開始]。
        } 
        [開始] ARR = Pと、
        リターンスタート。
    } 



    パブリック 静的 ボイドメイン(文字列[]引数){
         INT [] ARR = {1,2,3,2,2,2,5,4,2 }。
        INT NUM = MoreThanHalfNum_Solution(ARR)。
        System.out.println(NUM)。
    } 
}

 

 

ソリューション2

スタートから多数決アルゴリズムの使用は、アレイを介し完了するために、同時に除去2つの数値を入れて二つの異なる数字に遭遇しました。2つの数値を削除過半数ないかもしれないが、それは他のではない大多数であってもよいが、大多数の半分以上総数なぜなら、それは最後に残った間違いなく大多数の後に削除されることがあります。

この方法は、時間の複雑さ  O(n)、および配列は変更されません。

パブリック クラスソリューション{
     / ** 
     *検索数が配列の半分以上表示されます
     * 
     * @paramのアレイ配列
     * @return 、番号が存在しない返しますが、0を返す
      * / 
    公共 int型 MoreThanHalfNum_Solution(INT []配列を){
         IF(アレイ== NULL || Array.lengthと== 0こと){
             戻り 0 ; 
        } 
        
        int型 RES =配列[0 ];
         int型タイムズ= 1 ;
         のためのINT I = 1; Iは<Array.lengthとすること; ++ I){
            IF(タイムズ== 0 ){ 
                RES = 配列[i]は、
                時間 = 1 ; 
            } そう IF(配列[I] == RES){
                 ++ タイムズ; 
            } {
                 - タイムズ; 
            } 
        } 

        戻り isMoreThanHalf(アレイ、 RES)RES:?0 ; 
    } 


    / ** 
     *ヴァル要素が本当にかどうか複数のアレイ要素の数の半分より決定される
     * 
     * @paramのアレイ配列
     * @param 要素ヴァル
     * @returnブール
      * / 
    プライベート ブール isMoreThanHalf(INT []配列、int型のval){
         int型の CNT = 0 int型E:配列){
             もし、(E == ヴァル){
                 ++ CNT。
            } 
        } 

        戻り CNT * 2> Array.lengthと。
    } 
}

 

おすすめ

転載: www.cnblogs.com/lisen10/p/11234202.html