编写一个程序,找出第 n 个丑数。
丑数就是只包含质因数 2, 3, 5 的正整数。
示例:
输入: n = 10
输出: 12
解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。
说明:
1是丑数。n不超过1690。
=================================================
解题思路:动态规划
动态规划的题种类很多,有些题思路清晰,有些题就不知道如何处理
但是本质是不变的,找到递推的公式就可以
虽然有些公式不是很明显
一般简单的动态规划一般的公式 dp[n] 与 前几个dp[n-1] , dp[n-2] .....有关系
这道题我们不知道前面的哪个元素与dp[n]有关系
但是知道,肯定是哪个数乘2,乘3.或者乘5得出来的
2 = dp[1]*2
3= dp[1]*3
4= dp[2]*2
5 = dp[1]*5
6 = dp[3]*2 = dp[2]*3
....
我们拿num2,num3,num5来进行递推
比如num2 =1,num3=1,num5=1求dp[2],
我们可以求dp[num2]*2,dp[num3]*3,dp[num5]*5之间最小的那个
然后进行递推 dp[num2]*2最小,就使num2++
下面是代码
class Solution {
public int nthUglyNumber(int n) {
if (n<7){
return n;
}
int[] dp = new int[n + 1];
for (int i = 0; i < 7; i++) {
dp[i]=i;
}
int num2 = 4;
int num3 = 3;
int num5 = 2;
for (int i = 7; i < n+1; i++) {
dp[i]=Math.min(dp[num2]*2,Math.min(dp[num3]*3,dp[num5]*5));
if (dp[i]==dp[num2]*2){
num2++;
}
if (dp[i]==dp[num3]*3){
num3++;
}
if (dp[i]==dp[num5]*5){
num5++;
}
}
return dp[n];
}
}
==============================================
其实不用看我bb,看代码就可以看懂
792

被折叠的 条评论
为什么被折叠?



