繰り返し回数のための-287ルックのLeetcodeテーマ別二分法(重複番号を探します)
所与 N- 整数+ 1つのアレイ NUMS 1からの数であり、 N- (1〜を含む n-は)、少なくとも一つの存在は整数を繰り返すことを見出しました。それだけの一意の整数を想定すると、繰り返しの数を見つけます。
例1:
入力:[1,3,4,2,2]
出力:2
例2:
入力:[3,1,3,4,2] 出力:3
説明:
- あなたは、(配列が読み取り専用であることを仮定して)元の配列を変更することはできません。
- 唯一の余分な使用 Oのスペースを(1)。
- それはの時間複雑未満の O(N- 2)。
- 唯一の重複数字の配列が、それを複数回繰り返してもよいです。
被験者の分析は、N + 1アレイのサイズに、アレイは、1-nの間からであり、私たちの質問ルールのこの半分は次のようにします:
- 1つの左点、右点N、中央値は、左の中間点であります
- 与えるために、ハーフ、ミッド
- 番号の出現回数を反復し、少ない半ばを求めます
- 数が中間よりも大きい場合、中間、R =半ばを保持するために、このサーチ範囲において、この範囲内で、過剰な数の証明
- そうでない場合は、廃棄半ば、L =ミッド+1
ACコード:
クラスソリューション{ 公共 のint findDuplicate(INT [] NUMS){ int型のn = nums.length - 1 。 int型の L = 1 。 INT R = N。 一方、(L < R){ int型 1 >>>ミッド=(L + R) 。 int型のカウント= 0 ; 以下のために(int型 ; iはnums.length <I ++は、I = 0 ){ 場合(NUMS [I] <= MID)カウント++ 。 } であれば(カウント> MID){ R =ミッド; } 他{ L =ミッド+ 1 。 } } 戻りL。 } }