力扣 面试题49. 丑数 优先队列\dp

129 篇文章 2 订阅
11 篇文章 0 订阅

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

在这里插入图片描述
思路一:直接暴力做, p r i o r i t y _ q u e u e priority\_queue priority_queue取最小的数,然后把它的二倍、三倍、五倍放进去,这样第 n n n次取出来的就是答案。再搞个 m a p map map去重。

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;
        }
    }
};

思路二:维护一个 d p dp dp数组, d p [ i ] dp[i] dp[i]表示第 i + 1 i+1 i+1个丑数的值,结果为 d p [ n − 1 ] dp[n-1] dp[n1]。维护三个因子 2 、 3 、 5 2、3、5 235对应的下标 i d x 0 、 i d x 1 、 i d x 2 idx_0、idx_1、idx_2 idx0idx1idx2,那么 d p [ i ] = m i n ( d p [ i d x 0 ] ∗ 2 , d p [ i d x 1 ] ∗ 3 , d p [ i d x 2 ] ∗ 5 ) dp[i]=min(dp[idx_0]*2,dp[idx_1]*3,dp[idx_2]*5) dp[i]=min(dp[idx0]2,dp[idx1]3,dp[idx2]5),然后再扫一遍,把与之相等的情况对应的 i d x i idx_i idxi自增 1 1 1即可。

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];
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值