整数の配列を指定して 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 ; }