设计一个算法,找出只含素因子2,3,5 的第 n 小的数。
符合条件的数如:1, 2, 3, 4, 5, 6, 8, 9, 10, 12…
样例
如果n = 9, 返回 10
挑战
要求时间复杂度为O(nlogn)或者O(n)
思路:
根据丑数的定义可知,每一个丑数都是由前面的丑数生成。例如:2是由1*2得来,3是由1 *3得来。
C++:
class Solution {
public:
/**
* @param n: An integer
* @return: the nth prime number as description.
*/
int min(int a,int b)
{
if(a<b)
{
return a;
}
else
{
return b;
}
}
int nthUglyNumber(int n) {
// write your code here
int *ugly = new int[n];
ugly[0] = 1;
int num_2 = 0;
int num_3 = 0;
int num_5 = 0;
for(int i=1;i<n;i++)
{
ugly[i] = min(min(ugly[num_2]*2,ugly[num_3]*3),ugly[num_5]*5);
//下一个生成的丑数,是由已生成的最大的2丑数、3丑数、5丑数当中最小的来生成的。
if(ugly[i]/ugly[num_2]==2)
{
num_2++;
}
if(ugly[i]/ugly[num_3]==3)
{
num_3++;
}
if(ugly[i]/ugly[num_5]==5)
{
num_5++;
}
}
return ugly[n-1];
}
};
Py3:
class Solution:
"""
@param n: An integer
@return: the nth prime number as description.
"""
def nthUglyNumber(self, n):
# write your code here
ugly = [1]
num_2,num_3,num_5 = 0,0,0
for i in range(1,n):
Min = min(min(ugly[num_2]*2,ugly[num_3]*3),ugly[num_5]*5)
ugly.append(Min)
if ugly[i]/ugly[num_2]==2:
num_2 += 1
if ugly[i]/ugly[num_3]==3:
num_3 +=1
if ugly[i]/ugly[num_5]==5:
num_5 += 1
return ugly[n-1]