设计一个算法,找出只含素因子
2
,
3
,
5
的第
n 大的数。
符合条件的数如:1, 2, 3, 4, 5, 6, 8, 9, 10, 12...
注意事项
我们可以认为1
也是一个丑数
样例
如果n = 9
, 返回 10
思路:
任何一个丑数都是由 2^m*3^n*5^i组成的。 因此只需要设计一个算法 把这些数从小到大排序好就行了。
算法1:暴力破解,时间复杂度过于复杂
class Solution {
public:
/*
* @param n an integer
* @return the nth prime number as description.
*/
int nthUglyNumber(int n) {
// write your code here
int countN = 0;
int m = 0;
int lastNumber = 2;
while(countN < n)
{
m++;
int number = m;
while(number % 2 == 0)
number = number / 2;
while(number % 3 == 0)
number = number / 3;
while(number % 5 == 0)
number = number / 5;
if(number == 1)
{
countN++;
}
}
return m;
}
};
算法2:
import java.lang.Math;
public class Solution {
/*
* @param n: An integer
* @return: the nth prime number as description.
*/
public 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<ugly.length;i++){
ugly[i] = Math.min(Math.min(ugly[num_2]*2,ugly[num_3]*3),ugly[num_5]*5);
// 任何一个丑数都是2^i * 3^j * 5^m这种形式的,因此不断寻找丑数,将他们按从小到大的顺序进行排列
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];
}
}