問題の説明
素因数2、3、および5のみを含む数を醜い数と呼びます。小さいものから大きいものの順にn番目の醜い数を見つけます。
問題解決レポート
醜いの数のでのみ含む2,3,5-品質係数、したがって順に小さく醜い月の多数が上記醜いを得るために、素因数の数を乗じました。
優先キュー
優先度キューとコレクションを同時に作成します。
キューから最小数が取り出されるたびに、この数に3つの因子が順番に乗算され、次に3つの新しい3つの数がセットにあるかどうかが判断され、セットにない場合は、セットに挿入されてプッシュされますプライオリティキューでは、最後に取り出された番号がキューから排出されます。
動的プログラミング
なので、3つのインデックスを更新し続けます。
。
アップデート方法:
分析
最小の人は、対応するインデックスを1ビット戻します。
一連の連続して生成された醜い数の場合、それらは、以前の醜い数に3つの素因数の1つを順次乗算して生成されます。
例として素因数2のインデックスを取り上げます。醜い数に2を掛けた後、次の2の掛け算は、醜い数の次の醜い数、つまり対応するインデックスに1を加えたものでなければなりません。
実装コード
優先キュー
class Solution {
public:
int nthUglyNumber(int n) {
priority_queue<long long,vector<long long>, greater<long long>> pq;
set<long>s;
long long factor[3]={2, 3, 5},ans=1;
for (int i=0;i<3;i++) {
pq.push(factor[i]);
s.insert(factor[i]);
}
for (int i = 1; i < n; i++) {
ans = pq.top();
pq.pop();
for (int j = 0; j < 3; j++) {
if (s.find(ans * factor[j])==s.end()) {
pq.push(ans * factor[j]);
s.insert(ans * factor[j]);
}
}
}
return (int)ans;
}
};
動的プログラミング
class Solution{
public:
int nthUglyNumber(int n){
vector<int>dp(n,0);
dp[0]=1;
int p2=0,p3=0,p5=0;
for(int i=1;i<n;i++){
dp[i]=min(dp[p2]*2,min(dp[p3]*3,dp[p5]*5));
if(dp[i]==dp[p2]*2) p2++;
if(dp[i]==dp[p3]*3) p3++;
if(dp[i]==dp[p5]*5) p5++;
}
return dp[n-1];
}
};
参考文献
[1] Leetcoedインタビューの質問49.醜い数字
[2] 問題解決領域:ジェリー