LeetCodeブラシのタイトルは35タイトルを指摘します

件名の説明:

ソートされた配列とターゲットを考えると、配列内のオブジェクトを検索し、そのインデックスを返します。標的がアレイに存在しない場合、それが配列に挿入された位置に戻されます。

あなたは、アレイ内のことは、重複要素をとることができます。

問題解決のアイデア:

その後、カーソルを対応する戻り値が左、後に見ていない場合は、アイデアは、注文した配列に要素をインデックスの値に対応し、目標値に直接戻っ含まれている場合は、最も直接的なバイナリ検索を使用することです。直接注文アレイを横断することにあるカーソルを移動しながら、アレイを横断するための条件は、現在のアクセス目標値よりも小さい別の解決策は、以下の配列の長さよりも、トラバースの端部は、対応する値が返されるカーソル値を通過するはずです。

最初のソリューション:バイナリ検索

時間の複雑さがある:O(LOGN)

私は半ば値の計算上のコメントで議論を見て、いくつかの文言が残っより安全半ば= +(右であるので、オーバーフローする可能性/ 2は安全ではありません直接半ばには=(+右左)と言う - 左)/ 2;意志オーバーフローように10以上、オーバーフローが発生する二つの値、> 10 6、8、直接計算場合、6 + 8 = 14があるが、ミッド=左によって+ - この問題を回避するために、ミッド= 6 +(8-6)/ 2を計算する(左右)/ 2の式は、非常に合理的な、それが描画します。

公共 INT searchInsert(INT [] NUMS、int型のターゲット){
         場合(nums.length == 0 ||(目標<NUMS [0 ]))
             戻り 0 ;
        もし(ターゲット> NUMS [nums.length-1 ])
             戻りnums.length。
        もし(nums.length == 1 ){
             場合(目標> NUMS [0 ])
                 リターン 1 それ以外
                の戻り 0 ; 
        } 
        INTは = 0を残しましたint型の右= nums.length - 1;
        int型半ば=(左+右)/ 2 ;
        一方(左<= 右){
             場合(NUMS [中間] == ターゲット)
                 戻りミッド。
            そう であれば(NUMS [中間]> ターゲット){  =ミッド- 1 
            } { ミッド+ 1 = 
            } 
            半ば =(右+左)/ 2 
        } 
        戻り中間+ 1 
    }

最初のソリューションは続けた:バイナリ検索が向上し、サイクル数を減らすために

これは私がハハハハ、速いスピードを実行しませんが、私は問題の解決策が提供するコメントの誰かが、アイデアを学ぶことができます参照してくださいソリューションです。

    公共 INT searchInsert3(INT [] NUMS、int型のターゲット){
         int型 LO = 0、HI = nums.length。
        一方(LO <HI-1 ){
             int型ミッド=(LO + HI)>> 1 もし(目標< NUMS [中間])
                HI = ミッド。
            他の
                LO = ミッド; 
        } 
        戻り目標<= NUMS [LO]?LO:++ 見よ。
    }

第二の溶液:暴力トラバーサル

超短い、時間複雑度はO(N)であります

    公共 INT searchInsert2(INT [] NUMS、int型のターゲット){
         int型I。
        以下のための式(I = 0、I <nums.length && NUMS [I] <ターゲット; I ++ )。
        返す私は、
    }

 

おすすめ

転載: www.cnblogs.com/yxym2016/p/12528331.html