件名の説明:
ソートされた配列とターゲットを考えると、配列内のオブジェクトを検索し、そのインデックスを返します。標的がアレイに存在しない場合、それが配列に挿入された位置に戻されます。
あなたは、アレイ内のことは、重複要素をとることができます。
問題解決のアイデア:
その後、カーソルを対応する戻り値が左、後に見ていない場合は、アイデアは、注文した配列に要素をインデックスの値に対応し、目標値に直接戻っ含まれている場合は、最も直接的なバイナリ検索を使用することです。直接注文アレイを横断することにあるカーソルを移動しながら、アレイを横断するための条件は、現在のアクセス目標値よりも小さい別の解決策は、以下の配列の長さよりも、トラバースの端部は、対応する値が返されるカーソル値を通過するはずです。
最初のソリューション:バイナリ検索
時間の複雑さがある: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 ++ )。 返す私は、 }