力扣 面試題49. 醜數 優先隊列\dp

https://leetcode-cn.com/problems/chou-shu-lcof/

在這裏插入圖片描述
思路一:直接暴力做,priority_queuepriority\_queue取最小的數,然後把它的二倍、三倍、五倍放進去,這樣第nn次取出來的就是答案。再搞個mapmap去重。

class Solution {
public:
    using ll=long long;
    unordered_map<ll,bool> m;
    priority_queue<ll,vector<ll>,greater<ll>> q;
    int nthUglyNumber(int n) {
        q.push(1);
        ll val;
        while(1)
        {
            if(--n==0)
                return q.top();
            val=q.top();
            q.pop();
            if(m.find(val*2)==m.end())
                q.push(val*2),m[val*2]=1;
            if(m.find(val*3)==m.end())
                q.push(val*3),m[val*3]=1;
            if(m.find(val*5)==m.end())
                q.push(val*5),m[val*5]=1;
        }
    }
};

思路二:維護一個dpdp數組,dp[i]dp[i]表示第i+1i+1個醜數的值,結果爲dp[n1]dp[n-1]。維護三個因子2352、3、5對應的下標idx0idx1idx2idx_0、idx_1、idx_2,那麼dp[i]=min(dp[idx0]2,dp[idx1]3,dp[idx2]5)dp[i]=min(dp[idx_0]*2,dp[idx_1]*3,dp[idx_2]*5),然後再掃一遍,把與之相等的情況對應的idxiidx_i自增11即可。

class Solution {
public:
    using ll=long long;
    vector<ll> dp;
    int nthUglyNumber(int n) {
        dp.resize(n);
        dp[0]=1;
        int idx[3]={0,0,0};
        int val[3];
        for(int i=1;i<n;i++)
        {
            val[0]=dp[idx[0]]*2;
            val[1]=dp[idx[1]]*3;
            val[2]=dp[idx[2]]*5;
            dp[i]=min({val[0],val[1],val[2]});
            if(dp[i]==val[0])
                ++idx[0];
            if(dp[i]==val[1])
                ++idx[1];
            if(dp[i]==val[2])
                ++idx[2];
        }
        return dp[n-1];
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章