一、暴力法
从1开始对每一个数进行判断,是否可以连除2,3,5得到1,效率比较低
class Solution {
public:
int nthUglyNumber(int index) {
if(index<=0)return -1;
int number=0;
int count=0;
while(count<index)
{
++number;
if(isUgly(number))
{
++count;
}
}
return number;
}
bool isUgly(int n)
{
while(n%2==0)
n/=2;
while(n%3==0)
n/=3;
while(n%5==0)
n/=5;
return n==1?true:false;
}
};
二、以空间换取时间的做法
思路:把每一个丑数都列出来。
丑数肯定是2,3,5的倍数,所以每一个位置都可以乘2,3,5,找到比目前丑数大的丑数(因为比目前最大的丑数小的丑数已经出现在了容器中),然后在这三个比目前丑数大的丑数中找到最小的那个即为下一个丑数
class Solution {
public:
int nthUglyNumber(int n) {
if(n<=0)return 0;
vector<int> uglyNum(n,0);
int p2=0;
int p3=0;
int p5=0;
uglyNum[0]=1;//1为丑数
for(int i=1;i<n;++i)
{
uglyNum[i]=min(uglyNum[p2]*2,min(uglyNum[p3]*3,uglyNum[p5]*5));//选择*2*3*5中最小的那个丑数
if(uglyNum[i]==uglyNum[p2]*2)p2++;//如果该丑数等于当前*2,则往前移动一位,计算的值比当前最新的丑数大(其实可用while(uglyNum[i]<=uglyNum[最新的丑数位置])p2++,找到一个比当前最大丑数要大的丑数)
if(uglyNum[i]==uglyNum[p3]*3)p3++;//同上
if(uglyNum[i]==uglyNum[p5]*5)p5++;//同上
}
return uglyNum[n-1];
}
};