LeetCode-34.Findファーストおよびソートされた配列の要素の最後の位置

整数の配列を指定して  nums 昇順にソート、与えられたの開始と終了位置を見つける  target 値を。

あなたのアルゴリズムの実行時の複雑さは、の順番でなければなりません  O(ログ  nで)。

ターゲットが配列に見つからない場合、返却  [-1, -1]

例1:

入力:NUMS = [ 5,7,7,8,8,10]、目標= 8 
出力:[3,4]

例2:

入力:NUMSの= [ 5,7,7,8,8,10]、目標= 6 
出力:[-1、-1]

バイナリ検索変形、Oの時間複雑度(LGN)

    公共 のint []探索範囲(INT [] NUMS、int型のターゲット){//二分の私
         のint []再= 新しい int型 [2 ]。
        再[ 0] = bSearchFirst(NUMS、ターゲット)
        再[ 1] = bSearchLast(NUMS、ターゲット)
        戻る再; 
    } 
    
    プライベート INT bSearchFirst(INT [] NUMS、int型のターゲット){
         場合ヌル == NUMS 0 ==の|| nums.lengthを){
             返す -1 
        } 
        INT = 0左;
        int型右= nums.length-1をしながら、(左<= 右){
             int型ミッド=(左+右)/ 2 もし(NUMS [中間]> ターゲット){  =ミッド1 
            } 
            そう であれば(NUMS [中間] < ターゲット){  =ミッド+ 1 
            } 
            そう であれば((MID == 0)||(NUMS [中間-1] =目標)!){ // NUMS [中間] =目標如果、而且是第一个
                    戻り中間と、
            } 
             { // NUMS [中間] =目標如果、而且不是第一个
                右=半ば1 ; 
            } 
        } 
        戻り -1 
    } 
    プライベート INT bSearchLast(INT [] NUMS、int型のターゲット){
         場合ヌル == NUMS 0 ==の|| nums.lengthを){
             返す -1 
        } 
        INT 0 =左;
        int型右= nums.length-1をしながら、(左<= 右){
             int型ミッド=(左+右)/ 2 もし(NUMS [中期]>ターゲット){ = -mid 1。; 
            } 
            そう IF(NUMS [MID] < ターゲット){  = MID + 1 ; 
            } 
            そう IF((== nums.length-MID 1)||(NUMS [MID + 1]目標=!。 )){ // もしNUMS [中間] =目標、及び最後
                    リターンMID; 
            } 
            そう { // もしNUMS [中間] =目標、及び最後 
                左= MID + 1 ; 
            } 
        } 
        戻り -1 ; 
    }

 

おすすめ

転載: www.cnblogs.com/zhacai/p/11023279.html