题目
算法思路
设丑数序列为
x
1
,
x
2
,
x
3
,
.
.
.
,
x
n
x_1,x_2,x_3,...,x_n
x1,x2,x3,...,xn,则下一个丑数
x
n
+
1
x_{n+1}
xn+1 为以下三种情况中的最小值:
x
n
+
1
=
{
x
a
×
2
,
a
∈
[
1
,
n
]
x
b
×
3
,
b
∈
[
1
,
n
]
x
c
×
5
,
c
∈
[
1
,
n
]
x_{n+1}= \begin{cases} x_a\times2,&a\in[1,n]\\ x_b\times3,&b\in[1,n]\\ x_c\times5,&c\in[1,n] \end{cases}
xn+1=⎩⎪⎨⎪⎧xa×2,xb×3,xc×5,a∈[1,n]b∈[1,n]c∈[1,n]
即递推公式为
x
n
+
1
=
m
i
n
{
x
a
×
2
,
x
b
×
3
,
x
c
×
5
}
x_{n+1}=min\{x_a\times2,x_b\times3,x_c\times5\}
xn+1=min{xa×2,xb×3,xc×5}
其中索引
a
,
b
,
c
a,b,c
a,b,c 还需要满足下列条件:
- x a × 2 > x n ≥ x a − 1 × 2 x_a\times2>x_n\ge x_{a-1}\times2 xa×2>xn≥xa−1×2,即 x a x_a xa 应为首个乘2后大于 x n x_n xn 的丑数;
- x b × 3 > x n ≥ x b − 1 × 3 x_b\times3>x_n\ge x_{b-1}\times3 xb×3>xn≥xb−1×3,即 x b x_b xb 应为首个乘3后大于 x n x_n xn 的丑数;
- x c × 5 > x n ≥ x c − 1 × 5 x_c\times5>x_n\ge x_{c-1}\times5 xc×5>xn≥xc−1×5,即 x c x_c xc 应为首个乘5后大于 x n x_n xn 的丑数
具体代码
class Solution {
public int nthUglyNumber(int n) {
int a = 0, b = 0, c = 0;
int[] dp = new int[n];//动态规划列表,dp[i]代表第i+1个丑数
dp[0] = 1;//第一个丑数为1
for(int i = 1; i < n; i++){
int n2 = dp[a] * 2;
int n3 = dp[b] * 3;
int n5 = dp[c] * 5;
dp[i] = Math.min(Math.min(n2, n3), n5);//计算第i+1个丑数
//更新对应索引
if(dp[i] == n2)a++;
if(dp[i] == n3)b++;
if(dp[i] == n5)c++;
}
return dp[n - 1];//返回第n个丑数
}
}
复杂度分析
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( n ) O(n) O(n)