すご腕コード1201醜い番号III。
見つけるためのプログラム書く n
番目の醜い番号を。
醜い数字は割り切れるある正の整数である a
か、 b
または c
。
例1:
入力:N = 3、= 2、B = 3、C = 5 出力:4 説明:醜い番号が2、3、4、5、6、8、9、10 ...ている3は4です。
例2:
入力:N = 4 = 2、B = 3、C = 4 出力:6 説明:醜い番号が2、3、4、6、8、9、12 ...ている4は6です。
例3:
入力:N = 5、= 2、B = 11、C = 13 出力:10 説明:醜い番号2、4、6、8、10、11、12、13 ...ている5は10です。
例4:
INPUT:= N-1000000000、A = 2、B = 217 983 653 336 916 467 Cは= 出力:1999999984
:リファレンス
議論でleetcode [1]:https://leetcode.com/problems/ugly-number-iii/discuss/387539/cpp-検索-と-バイナリピクチャー-バイナリ検索とテンプレート
[2]ユークリッドの互除法最大公約数:https://www.cnblogs.com/kirito-c/p/6910912.html(与えられましたエラーコードGCD)
と題する:シークは、n AまたはBまたはC割り切れるの正の整数とすることができます。
翻訳:argmin_N F(N)を求めて、F( N)は= またはB、またはCがN、カウント数、F(N)== N未満、分割することができる
F(a)は=となるように、さらに同様のF(B)、F(C割り切れるNの数よりも少ない数 )。その結果、G(a、b)はA、B、最小公倍数。
タイトルは、次になる:argmin_N F(N)、F - F(G(B)) - F(G(C))(N)は、F(A)+ F(B)+ F(C)= - F(G(B、C ))+ F(G(A、B、C))、F(N)== N
海賊説明するための図:A = F(A)、B = F(B)などが挙げられます。
この場合、2つの質問が含まれます。
F 1は、Nよりも少ない数がによって(a)の数割り切れることができる方法を見つけますか?
2.方法(B)とB、Gの最小公倍数を見つけますか?
:全てで割り切れる数であることができる。1. N /、P *はAのように表現されてもよく、pは正の整数です。NはPのF(A)の可能な値として表現される数より少ない全*数、及びN / 1〜pの値。したがって、答えはN / Aです
2. *のB / Aのように最大公約数bを計算最小公倍数。ユークリッドアルゴリズムによる最大公約数はユークリッドアルゴリズムを解決するために、つまり、することができます。
次のように一般的に理解さ:小の多数及び数bが存在する場合、%Bは== 0の場合、bがaとbの最大公約数です。
!場合%B = 0、*はB + R、R =(Sがあり、tは、Bの除数であり、Rは剰余であり、= Sは* T、B = UがTを* = Qを仮定 - Q * U)*さt、tは数の除数が残りAおよびBであることを示しています。したがって、BとRの最大公約数は、aとbの最大公約数です。そのような再帰は、余りが0である時には、除数は最大公約数です。
コードは次のように記述することができます。
int型GCD(INT A、INT B){ int型R = 0。 (B){一方 、R =%のB; = B; B = R。 } を返します。 }
計算されたFおよびGを取得した後、最小のN F(N)==のn個の条件を見つけることができます。すなわち、M> = N場合、F(M)> = F(N)がある、F(N)は単調関数で見ることができます。
これは、順序付けられたアレイにn個の要素の値を見つけるためにインデックスに類似しています。F(N)は、Nがそのインデックスである、配列です。そのため、あなたはバイナリ検索を使用することができます。
insomniacatは 、バイナリサーチのための基本的なフレームワークを提供します。
一方(LO <HI){ int型ミッド= + LO(HI - LO)/ 2。 (オプション)(特別条件が渡される)の場合: 半ばを返します。 (条件が渡された)場合は 、HI =ミッド; 他の LO =ミッド+ 1; } LOを返します。
最終的なコード:
クラスソリューション{ パブリック: INT nthUglyNumber(整数nは、INTのB、INT C INT){ int型LO = 1、HI = 2 *(INT)1E9。 長いA = A、B = B、C = C。 長いAB = A * B / GCD(A、B)。 長いAC = A * C / GCD(A、C)。 長いBC =のB * C / GCD(B、C)。 長いABC = A * BC / GCD(A、BC)。 一方(LO <HI){ int型ミッド=(HI - LO)/ 2 + LO。 // F(N)を計算 ミッド/ AB - -ミッド/ AC -長いFN =ミッド/ A +ミッド/ B +ミッド/ Cミッド/ BC +ミッド/ ABCを、 (FN <N)の場合 LO =ミッド+ 1。 他の ハイテク=ミッド; } } LOを返します。 int型GCD(長い、長いB){ int型のR。 (B){一方 、R =%のB; = B; B = R。 } を返します。 } }。