题目链接:
题目描述:
找出第n个丑数。
丑数:1是一个特殊的丑数,其次只含有2,3,5质因数的数被定义为丑数。
题目分析:
诶,自己做没做出来。
http://www.geeksforgeeks.org/ugly-numbers/
可以参考这个很详细哒。
根据动态规划的思想,当前的丑数肯定是由之前某个丑数乘2或乘3或乘4得到。这样就能得到一个生成链,麻烦的是这个生产链得是有序的。用三个指针idx2,idx3,idx4来保证有序。
且我们要保证每次迭代选择的都是最小的丑数。
factor2表示2*之前的某个丑数,idx2表示之前那个丑数的下标。当factor2被更新了,那么idx2指针也要前进一位。
代码:
class Solution {
public:
int minAmongThree(int a,int b,int c){
int minNum=a<b?a:b;
return minNum<c?minNum:c;
}
int nthUglyNumber(int n) {
vector<int> uglyNums(n,0);
uglyNums[0]=1;
int idx2,idx3,idx5;
idx2=idx3=idx5=0;
int factor2=1,factor3=1,factor5=1;
for(int i=0;i<n;i++){
uglyNums[i]=minAmongThree(factor2,factor3,factor5);
if(factor2==uglyNums[i]){
factor2=2*uglyNums[idx2++];
}
if(factor3==uglyNums[i]){
factor3=3*uglyNums[idx3++];
}
if(factor5==uglyNums[i]){
factor5=5*uglyNums[idx5++];
}
}
return uglyNums[n-1];
}
};