1 题目描述
2 算法思路
思路:
- 首先要通过性质可知,每一个丑数,必定可以由前面的丑数 乘以 2 / 3 / 5所得
- 因此,当前丑数,应该是前面的 xa * 2 / xb * 3 / xc * 5中的最小值
- 那么如何求得xa,xb,xc呢
- 可知,丑数是按照顺序存储的,因此当前丑数必定满足三个条件,即
- xa * 2 > x > xa-1 * 2 //3 和 5的省略
动态规划算法:
- 状态定义:dp[i] 代表第i + 1个丑数
- 转移方程:
- 首先a,b,c 要满足上述的三个条件
- dp[i] = min(dp[a] * 2, dp[b] * 3, dp[c] * 5)
- 然后在每轮计算后,需要更新a,b,c的值,如果出现dp[a] *2 == dp[b] * 3的情况,那么a和b都要加一
- 初始状态:dp[0] =1
- 返回值:dp[n - 1]
3 代码
class Solution {
public int nthUglyNumber(int n) {
int a = 0;
int b = 0;
int c = 0;
int[] dp = new int[n];
dp[0] = 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);
if(dp[i] == n2)
a++;
if(dp[i] == n3)
b++;
if(dp[i] == n5)
c++;
}
return dp[n - 1];
}
}
4 提交结果