Leetcodeインタビューの質問49.醜い番号[優先キュー|動的プログラミング]

問題の説明

素因数2、3、および5のみを含む数を醜い数と呼びます。小さいものから大きいものの順にn番目の醜い数を見つけます。

問題解決レポート

醜いの数のでのみ含む2,3,5-品質係数、したがって順に小さく醜い月の多数が上記醜いを得るために、素因数の数を乗じました。

優先キュー

優先度キューとコレクションを同時に作成します。
キューから最小数が取り出されるたびに、この数に3つの因子が順番に乗算され、次に3つの新しい3つの数がセットにあるかどうかが判断され、セットにない場合は、セットに挿入されてプッシュされますプライオリティキューでは、最後に取り出された番号がキューから排出されます。

動的プログラミング

d p [ i ] = m i n ( d p [ j 2 ] 2 , d p [ j 3 ] 3 , d p [ j 5 ] 5 ) dp [i] = min(dp [j2] * 2、dp [j3] * 3、dp [j5] * 5) なので、3つのインデックスを更新し続けます。 j 2 j 3 j 5 j2、j3、j5
アップデート方法:
分析 d p [ j 2 ] 2 , d p [ j 3 ] 3 , d p [ j 5 ] 5 dp [j2] * 2、dp [j3] * 3、dp [j5] * 5 最小の人は、対応するインデックスを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] 問題解決領域:ジェリー

MD_
139の元の記事を公開 賞賛8 10,000+ビュー

おすすめ

転載: blog.csdn.net/qq_27690765/article/details/105381884