题目:
Write a program to find the n
-th ugly number.
Ugly numbers are positive numbers whose prime factors only include 2, 3, 5
. For example, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12
is the sequence of the first 10
ugly numbers.
Note that 1
is typically treated as an ugly number.
代码:
版本1:
class Solution1 {
public:
int nthUglyNumber(int n) {
vector<int>num = {2,3,5};
vector<int>re;
re.push_back(0);
//少于6个数
for (int i = 0; i < 6; i++)re.push_back(1);
if (n <= 6)return n;
//多于6个数
int count = 0, end = n - 6, i = 7, size = num.size();
bool flag;
while(count!=end){
flag = true;
for (int j = 0; j < size; j++){
if (i%num[j] == 0 && re[i / num[j]] == 1){
re.push_back(1);
count++;
flag = false;
break;
}
}
if(flag)re.push_back(0);
i++;
}
return --i;
}
};
版本2:
class Solution2 {
public:
int nthUglyNumber(int n) {
vector<int>re;
re.push_back(0);
//少于6个数
for (int i = 0; i < 6; i++)re.push_back(1);
if (n <= 6)return n;
//多于6个数
int count = 0, end = n - 6, i = 7;
while (count != end){
if (i % 2 == 0 && re[i / 2] == 1){
re.push_back(1);
count++;
i++;
continue;
}
if (i % 3 == 0 && re[i / 3] == 1){
re.push_back(1);
i++;
count++;
continue;
}
if (i % 5 == 0 && re[i / 5] == 1){
re.push_back(1);
i++;
count++;
continue;
}
re.push_back(0);
i++;
}
return --i;
}
};
以上两种版本运行没有错误,但是时间超时!!
版本3:
class Solution {
public:
int nthUglyNumber(int n) {
vector<int>re(n+1,0);
re[0] = 1;
//利用队列的思想
int t2 = 0, t3 = 0, t5 = 0;
//t2控制当前指向的数乘以2,t3控制当前指向的数乘以3,t5控制当前指向的数乘以5
for (int i = 1; i <= n;i++){
re[i] = min(re[t2] * 2, min(re[t3] * 3, re[t5] * 5));
//如果对于第i个丑数的值可以乘2或乘3得到,那么t2和t3都加1
if (re[i] == re[t2] * 2) t2++;
if (re[i] == re[t3] * 3) t3++;
if (re[i] == re[t5] * 5) t5++;
}
return re[n-1];
}
};