第 56 日:49. 丑数
题目链接:https://leetcode-cn.com/problems/chou-shu-lcof/
题目
解题
-
动态规划
解题思路:
注意这一题的题目是只包含质因子2、3、5的数称为丑数,也就是说14这种并不是。
丑数的因子都会包含2、3、5其中的一个,也可能包含多个,也可以全部包含,如下:
nums2 = {1*2, 2*2, 3*2, 4*2, 5*2, 6*2, 8*2...}
nums3 = {1*3, 2*3, 3*3, 4*3, 5*3, 6*3, 8*3...}
nums5 = {1*5, 2*5, 3*5, 4*5, 5*5, 6*5, 8*5...}
# 注意 7 不是丑数.
# 2, 3, 5 这前 3 个丑数一定要乘以其它的丑数, 所得的结果才是新的丑数, 所以上例中没有出现 7*2, 7*3, 7*5
然后回归到动态算法上,我个人认为就是在遍历的同时求出对后面有用的信息,这一题来说就是求包含质因子2、3、5的丑数,那我们就可以根据前面的丑数再乘以2或3或5其中的一个就可以求解,那么如何顺序的求出丑数呢,
这就要涉及下标移动了。
详细题解推荐大佬:https://leetcode-cn.com/problems/chou-shu-lcof/solution/chou-shu-ii-qing-xi-de-tui-dao-si-lu-by-mrsate/
详细代码如下:
class Solution{
public int nthUglyNumber(int n) {
int two=1,three=1,five=1;//这三个数指的下标
int[] res=new int[n+1];
res[1]=1;
for (int i = 2; i < res.length; i++) {
int a=res[two]*2,b=res[three]*3,c=res[five]*5;
res[i]=Math.min(Math.min(a,b), c);
if (res[i]==a) two++;
if (res[i]==b) three++;
if (res[i]==c) five++;
}
return res[n];
}
}