题目来源
解题方法
动态规划
关键点:一个数若是丑数,则其2或者3或者*5以后也是丑数
掌握了关键点以后,我们就可以设置dp[0]为1,那么分别有在1基础上一直2,一直3,一直5这样的三个序列,那么这题就可以改为合并3个有序数组,所以我们设置p1,p2,p3这样的三个指针,每次选取最小的那个成为dp[i],并移动指针,之所以设置3个if是为了去除相同元素,比如23和3*2都能得到6,但是我们只需要一个,所以我们就使用3个if,将碰到6的数组的指针都向前移动
class Solution {
public:
int nthUglyNumber(int n) {
vector<int> dp(n,0);
dp[0]=1;
int p1=0;
int p2=0;
int p3=0;
for(int i=1;i<n;i++){
dp[i]=min(min(dp[p1]*2,dp[p2]*3),dp[p3]*5);
if(dp[i]==dp[p1]*2)
p1++;
if(dp[i]==dp[p2]*3)
p2++;
if(dp[i]==dp[p3]*5)
p3++;
}
return dp[n-1];
}
};