思路:
- 更大的数是由小一些的数乘以2、3、5得到的,但是要取更小的那一个。
- dp[a]*2,dp[b]*3,dp[c]*5逐步往后走,遇到重的就跳过去。
- 所有的数都被乘以a之前的数都被乘以2过,所以不用往回找。
代码
class Solution {
public:
int nthUglyNumber(int n) {
vector<int> dp(n,0);
dp[0]=1;
int a=0,b=0,c=0;
for(int i=1;i<n;i++){
dp[i]=min(dp[a]*2,min(dp[b]*3,dp[c]*5));
if(dp[i]==dp[a]*2) a++;
if(dp[i]==dp[b]*3) b++;
if(dp[i]==dp[c]*5) c++;
}
return dp[n-1];
}
};