タイトル説明:
n番目の醜い数を見つけるプログラムを書いてください。
醜い数は正の数であり、その素因数には2、3、5しか含まれていません。
中国語の説明:
n番目の醜い数を見つけるプログラムを書いてください。
醜い数は、素因数が2、3、および5のみを含む正の整数です。
例:
入力:n = 10
出力:12
説明:1、2、3、4、5、6、8、9、10、12は、最初の10個の醜い数字のシーケンスです。
注意:
1は通常、醜い数字として扱われます。
nは1690を超えません。
時間計算量:OOO(NNN)
3つのポインターがマージされます。
ポインターi、j、およびkは、それぞれ2、3、および5を含む醜い数の配列S2、S3、およびS5へのポインターです。
S2:{ 1×2 1 \ times2
1××2、 2×2 2 \ times22××2、 3×2の3 \ times23××2、 4×2 4 \ times24××2、 5×2 5 \ times25××2、 6×2 6 \ times26××2、 8×2 8 \ times28××2、…}
S3:{ 1×31 \ times3
1××3、 2×3 2 \ times32××3、 3×3の3 \ times33××3、 4×3の4 \ times34××3、 5×3 5 \ times35××3、 6×3 6 \ times36××3、 8×3 8 \ times38××3、…}
S3:{ 1×51 \ times5
1××5、 2×5 2 \ times52××5、 3×5 3 \ times53××5、 4×5 4 \ times54××5、 5×5 \ times55××5、 6×5 6 \ times56××5、 8×5 8 \ times58××5、…}
観察すると、基本配列SSがあることがわかります。S:{ 1 1
1、2 22、3 33、4 44、55、6 66、8 88、…}
S2 =S×2S \ times2S××2、S3 =S×3S \ times3S××3、S5 =S×5S \ times5S××5。
したがって、我々はこの基準を使用して次の番号の最小値を乗算醜いアレイ及び2,3,5の数は、醜いと対応するポインタの移動の始まりです。満たすものが複数ある場合は、6番目の醜い数6のように、条件を満たすポインタを移動する必要があることに注意してください。S2in3×23 \ times23××2 = 6ポインタは3で、4に移動します。同時に、S3では2×3 2 \ times3です。2××3 = 6ポインタは2であり、3に移動する必要があります。
class Solution {
public int nthUglyNumber(int n) {
int[] res = new int[n];
int i = 0,j = 0,k = 0;
res[0] = 1;
for(int index = 1; index < n;index++){
int t = Math.min(Math.min(res[i]*2, res[j]*3), res[k]*5);
res[index] = t;
if(res[i]*2 == t) i++;
if(res[j]*3 == t) j++;
if(res[k]*5 == t) k++;
}
return res[n-1];
}
}