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