题目:
我们把只包含因子2,3,和5的数称为丑数(ugly Number)。求按从小到大的顺序的第1500个数。例如6、8都是丑数,但14不是,因为它包含因子7.习惯上我们把1当做第一个丑数。
一、暴力解法,不推荐
遍历并且判断该数是不是丑数。
class Solution
{
public:
int GetUglyNumber_Solution( int index )
{
int count = 0, i = 0;
if ( index <= 0 )
return 0;
while ( ++i )
{
if ( IsUgly( i ) )
count++;
if ( count == index )
break;
}
return i;
}
bool IsUgly( int number )
{
while ( number % 2 == 0 )
number /= 2;
while ( number % 3 == 0 )
number /= 3;
while ( number % 5 == 0 )
number /= 5;
return number == 1;
}
};
二、根据现在已经知道的丑数推导出下一个丑数,用空间换时间的算法
给一个丑数乘以2,3,5得到的还是丑数。
class Solution
{
public:
int GetUglyNumber_Solution( int index )
{
if ( index <= 0 )
return 0;
vector<int> uglyNumber;
uglyNumber.push_back(1);
int t2 = 0, t3 = 0, t5 = 0;
while ( uglyNumber.size() < index )
{
while ( uglyNumber[t2]*2 <= uglyNumber.back() )
t2++;
while ( uglyNumber[t3]*3 <= uglyNumber.back() )
t3++;
while ( uglyNumber[t5]*5 <= uglyNumber.back() )
t5++;
int nextUgly = myMin( uglyNumber[t2]*2, uglyNumber[t3]*3, uglyNumber[t5]*5 );
uglyNumber.push_back(nextUgly);
}
return uglyNumber.back();
}
int myMin( int a, int b, int c )
{
int d = a < b ? a : b;
int f = c < d ? c : d;
return f;
}
};