剑指 offer 48 丑数
超时版本
逐个判断这个数是不是丑数,直到找到第 n n n个丑数。
class Solution {
public int nthUglyNumber(int n) {
int counts = 0;
int i = 1;
while(counts<=n){
if(isUglyNumber(i)){
counts++;
}
i++;
}
return i;
}
public boolean isUglyNumber(int num){
while(num %2 !=0){
num /=2;
}while(num %3 !=0){
num /=3;
}while(num %5 !=0){
num /=5;
}
return num==1;
}
}
创建数组保存已经找到的丑数,用空间换时间的解法
class Solution {
public int nthUglyNumber(int n) {
if (n<=3){
return n;
}
int[] uglyNumber = new int[n];
for (int i = 0; i < 3; i++) {
uglyNumber[i] = i+1;
}
int T2 = 0;
int T3 = 0;
int T5 = 0;
int M2 = 0;
int M3 = 0;
int M5 = 0;
for (int i = 3; i <n ; i++) {
while (uglyNumber[T2]*2<=uglyNumber[i-1]){
T2++;
}
M2 = uglyNumber[T2]*2;
while (uglyNumber[T3]*3<=uglyNumber[i-1]){
T3++;
}
M3 = uglyNumber[T3]*3;
while (uglyNumber[T5]*5<=uglyNumber[i-1]){
T5++;
}
M5 = uglyNumber[T5]*5;
uglyNumber[i] = Math.min(M2,Math.min(M3,M5));
}
return uglyNumber[n-1];
}
}
时间复杂度
O
(
n
)
O(n)
O(n),需要计算数组
u
g
l
y
N
u
m
b
e
r
uglyNumber
uglyNumber中的
n
n
n个元素,每个元素的计算都可以在
O
(
1
)
O(1)
O(1)的时间内完成。
空间复杂度
O
(
n
)
O(n)
O(n),需要存储
n
n
n个丑数。