超级丑数--堆+集合 or dp找规律

Posted C_YCBX Py_YYDS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了超级丑数--堆+集合 or dp找规律相关的知识,希望对你有一定的参考价值。

题目

解法一:堆+集合

过程很简单就是通过最小堆得到每次选择操作后的最小值,再根据这个最小值扩散,如果过程中出现了重复的,就用set去重就可。

class Solution {
public:
    int nthSuperUglyNumber(int n, vector<int>& primes) {
        using ll = long long;
        priority_queue<ll,vector<ll>,greater<ll> >Q;
        unordered_set<ll>check;check.emplace(1);
        Q.push(1);
        int sz = primes.size();
        int res;
        while(n--){
            res = Q.top();Q.pop();
            for(int i=0;i<sz;i++){
                if(!check.count((ll)res*primes[i])){
                    Q.push((ll)res*primes[i]);
                    check.emplace((ll)res*primes[i]);
                }    
            }
        }
        return res;
    }
};

解法二:动态规划==找规律解决

简而言之,就是每次取完一个值后便把这个值对应的指针往后移动。

class Solution {
public:
    int nthSuperUglyNumber(int n, vector<int>& primes) {
        int dp[n];
        int sz = primes.size();
        memset(dp,0,sizeof(dp));
        dp[0] = 1;
        int pointer[sz];memset(pointer,0,sizeof pointer);
        for(int i=1;i<n;i++){
            int res = INT_MAX;
            for(int j=0;j<sz;j++){
                res = min(dp[pointer[j]]*primes[j],res);
            }
            dp[i] = res;
            //去重,指针偏移
            for(int j=0;j<sz;j++){
                if(dp[pointer[j]]*primes[j]==dp[i])
                    pointer[j]++;
            }
        }
        return dp[n-1];
    }
};

以上是关于超级丑数--堆+集合 or dp找规律的主要内容,如果未能解决你的问题,请参考以下文章

[M思维] lc313. 超级丑数(多路归并+STL堆)

HDU - 4722 Good Numbers 找规律 or 数位dp模板

LeetCode 313. 超级丑数(最小堆动态规划)/413. 等差数列划分/167. 两数之和 II - 输入有序数组

java算法之超级丑数

264. 丑数 II

[M思维] lc264. 丑数 II(多路归并+STL堆)