リンクします。https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array
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]
この問題は、2つの点が解決できるで二回もあり、開始位置の性質が目標条件を満足する最初の数に等しいより大きい決定します。それはこの数が目標に等しくない検出された場合、対象は、本明細書、ダイレクトリターン[-1、-1]はありません。終了位置の性質を決定すると、以下の条件数の目標を満たすために最後のものです。
次のようにC ++のコードは次のとおりです。
1 クラスソリューション{ 2 公共: 3 ベクトル< INT >探索範囲(ベクトル< INT >&NUMS、int型のターゲット){ 4 もし(nums.empty())戻り { - 1、 - 1 }。 5 int型の L = 0、R = nums.size() - 1 ; 6 一方、(L < R){ 7 int型ミッド= L + R >> 1 。 8 もし(NUMS [中間]> =目標)R = ミッド。 9 他リットル=ミッド+1 ; 10 } 11 INTは左= Rと、 12 COUTは<< <<左ENDLと、 13 であれば(NUMS [左] =目標!)リターン { - 1、 - 1 }。 14 L = 0、R = nums.size() - 1 ; 15 一方(L < R){ 16 のintミッド= L +(長い 長い)R + 1 >> 1 。 17 であれば(NUMS [中間] <=ターゲット)L = ミッド。 18 他R =ミッド- 1 。 19 } 20 INT右= R。 21 coutの<<右<< てendl; 22 リターン{左、R}。 23 24 } 25 }。