NUMSターゲットとつの目標値に応じて、昇順に配列された整数の配列を考えます。アレイ内の所与の標的の開始および終了位置を特定します。
アルゴリズムのあなたの時間の複雑さは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]
回答:
公共 のint []探索範囲(INT [] NUMS、int型のターゲット){ INT [] RES = { - 1、-1 }。 もし(!NUMS = NULL && nums.length> 0 ){ int型 _0 = -1 。 int型 _1 = -1 ; int型 LO = 0 ; int型 HI = nums.length-1 ; 一方(LO <= HI){ int型ミッド=(LO + HI)/ 2 。 もし(NUMS [中間]> ターゲット){ HI =半ば1 。 } そう であれば(NUMS [中間] < ターゲット){ LO =ミッド+ 1 。 } 他{ INT turnLeft = ミッド。 int型 turnRight = ミッド; 一方、(turnLeft> = LO || turnRight <= HI){ 場合(_0> -1 && _ 1> -1 ){ ブレーク。 } であれば(_0 == - !1 &&(turnLeft> = LO &&(turnLeft-1)> = 0 && NUMS [turnLeft-1] =目標)||(turnLeft == LO && NUMS [turnLeft] == ターゲット)){ _0 turnLeft; } であれば(_1 ==! - 1 &&(turnRight <= HI &&(turnRight + 1)<nums.length && NUMS [turnRight + 1] =目標)||(turnRight == HI && NUMS [turnRight] == ターゲット)){ _1 = turnRight ; } turnLeft - 。 turnRight ++ ; } RES [ 0] = _0。 RES [ 1] = _1。 休憩; } } } リターンのres; }
出典:滞在ボタン(LeetCode)
リンクします。https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array