给你一个整数 n ,请你找出并返回第 n 个 丑数 。
简单版,当n变大时,时间复杂度会爆炸性增长
bool isugly(int n)
{
bool ok = true;
while (ok == true)
{
if (n % 2 == 0)
{
n = n / 2;
continue;
}
if (n % 3 == 0)
{
n = n / 3;
continue;
}
if (n % 5 == 0)
{
n = n / 5;
continue;
}
ok = false;
}
if (n == 1)
{
return true;
}
else return false;
}
//最简版,n较小时,还可以,n较大时,时间会爆增。
int nthUglyNumber(int n)
{
int i = 1;
int j;
for ( j = 1; i <= n; j++)
{
if (isugly(j))
{
i++;
}
}
return j-1;
}
利用递归,进行算法优化,可以大幅提高代码运行速率(参考博客园十步一杀2017)
int nthUglyNumber(int index) {
if(index < 1)
return 0;
vector<int> uglyNums;
uglyNums.push_back(1);
int t2 =0, t3=0, t5 =0;
for(int i=0;i<index;i++){
// *2
int m2 =1, m3=1,m5=1;
for(int j = t2; j<uglyNums.size(); j++){
m2 = uglyNums[j] * 2;
if(m2 > uglyNums[uglyNums.size()-1]){
t2 = j;
break;
}
}
// *3
for(int j = t3; j<uglyNums.size(); j++){
m3 = uglyNums[j] * 3;
if(m3 > uglyNums[uglyNums.size()-1]){
t3 = j;
break;
}
}
// *5
for(int j = t5; j<uglyNums.size(); j++){
m5 = uglyNums[j] * 5;
if(m5 > uglyNums[uglyNums.size()-1]){
t5 = j;
break;
}
}
uglyNums.push_back(min(min(m2,m3),m5));
}
return uglyNums[index-1];
}