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.
Hint:
- The naive approach is to call
isUgly
for every number until you reach the nth one. Most numbers are not ugly. Try to focus your effort on generating only the ugly ones. - An ugly number must be multiplied by either 2, 3, or 5 from a smaller ugly number.
- The key is how to maintain the order of the ugly numbers. Try a similar approach of merging from three sorted lists: L1, L2, and L3.
- Assume you have Uk, the kth ugly number. Then Uk+1 must be Min(L1 * 2, L2 * 3, L3 * 5).
题目解析:给定三个素数,求出因子只保含这三个素数的第n个数.
这里,最简单的方法就是枚举,然后一一判断,但这样时间代价过高.
比较简单的方法是记录每个值走选到了第几个素数,假设只有一个素数,那么res[i] = res[i- 1] * primes[j], 那么下一个素数res[i + 1] = res[i] * primes[j + 1]
多个素数的时候就需要记录下一个选取的素数是哪个.
class Solution {
public:
int nthUglyNumber(int n) {
if (n == 1) return 1;
int primes[3] = {2, 3, 5};
int id[3] = {0, 0, 0};
vector<int> res(n);
res[0] = 1;
for (int i = 1; i < n; ++i)
{
int m = INT_MAX;
for (int j = 0; j < 3; ++j) {
m = min(m, res[id[j]] * primes[j]);
}
res[i] = m;
for (int j = 0; j < 3; ++j) {
if (res[id[j]] * primes[j] == m) {
id[j]++;
}
}
}
return res[n - 1];
}
};