タイトル説明
ソートされた配列とターゲットを考えると、配列内のオブジェクトを検索し、そのインデックスを返します。標的がアレイに存在しない場合、それが配列に挿入された位置に戻されます。
あなたは、アレイ内のことは、重複要素をとることができます。
例1:
入力:[1,3,5,6]、5
出力:2
例2:
入力:[1,3,5,6]、2
出力:1
例3:
入力:[1,3,5,6]、7
出力:4
例4:
入力:[1,3,5,6]、0
出力:0
アイデア:二分法
- 被験者場合暴力のが解決することが必要O(N)時間の複雑さが、二つの点場合、それはに減少させることができるO(LOGN)時間計算
- 最初は左の添字が設定され、左と右の添え字は右、そして中間の添字の計算中旬を
- 当たりNUMS [MID ]と目標同等のサイズを決定するための直接の添え字を返し、NUMS [中間] < ターゲットがされ、左から右へ、NUMS [MID ]> ターゲット右左
- 返されない値が左に等しくなければ検索が終了すると、その挿入位置であります
- 二値の考え方を理解することは困難を見つけるが、境界条件を追加するかどうかなどのように、エラーを起こしやすい1マイナスの関係の終わりに1サイクルは、左と右の条件は、更新が左と右の場所。
テンプレート
境界条件のエラーを排除、テンプレートのようなことを忘れないでください。
クラスソリューション{
公共 のint searchInsert(INT [] NUMS、INT ターゲット){
int型左= 0、右= nums.length - 1。// 注意
しながら(左<=右){ // 注意
INT半ば=(左+右)/ 2。// 注意
場合(== NUMS [中間]目標){ // 注意
// 相关逻辑
} そう であれば(<NUMS [中間] 目標){
左ミッド+ 1 =。// 注意
} 他 {
右 = MID - 1; // 注
}
}
// 相関値戻る
戻り 0 ;
}
}
コードの実装
クラスソリューション{
公共 のint searchInsert(INT [] NUMS、INT ターゲット){
// 左と右の添字の定義は、添字左右
INT。、右= nums.length左= 0 - 1 、
しばらく(左<= 右) {
INT MID =(右+左)/ 2 ;
// 場合等しいNUMS [中間]とターゲット要素、直接リターン
のiF(NUMS [中間] == ターゲット){
リターンMID;
// NUMSなら[中間]未満目標より次の間隔のための要素、左右[ミッド+ 1、右]
} 他 IF(NUMS [MID] < ターゲット){
左 = MID + 1 ;
// 一方、目標要素よりNUMS [中間]以上、左右[左、中間1]次の間隔の間
} 他{
右 = MID - 1 ;
}
}
// 端を見つけた場合戻り値が左に等しくない場合、値は挿入された位置の
復帰は、左;
}
}