https://leetcode-cn.com/problems/chou-shu-lcof/
思路一:直接暴力做,取最小的数,然后把它的二倍、三倍、五倍放进去,这样第次取出来的就是答案。再搞个去重。
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;
}
}
};
思路二:维护一个数组,表示第个丑数的值,结果为。维护三个因子对应的下标,那么,然后再扫一遍,把与之相等的情况对应的自增即可。
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];
}
};