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[n−1]。维护三个因子 2 、 3 、 5 2、3、5 2、3、5对应的下标 i d x 0 、 i d x 1 、 i d x 2 idx_0、idx_1、idx_2 idx0、idx1、idx2,那么 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];
}
};