提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
题目描述
我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。
示例:
输入: n = 10
输出: 12
解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。
说明:
1 是丑数。
n 不超过1690。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/chou-shu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题过程
解题思路
三指针+动态规划。动态规划数组dp依次保存从小到大的丑数。
1、定义动态规划数组dp;
2、定义三个指针变量a、b、c,所指向的内容是动态数组的三个不同丑数;
3、循环中ua、ub和uc分别是三个指针变量a、b、c所指向内容与因子2、3和5的乘积;
4、dp[i]更新为ua、ub和uc的最小值;
5、指针变量前移取决于本次更新的dp[i]来源于ua、ub和uc的哪一个。
class Solution {
public int nthUglyNumber(int n) {
int [] dp = new int[n];
int a = 0;
int b = 0;
int c = 0;
dp[0] = 1;
for(int i = 1; i < n; i++){
int ua = dp[a] *2;
int ub = dp[b] *3;
int uc = dp[c] *5;
dp[i] = Math.min(ua, Math.min(ub, uc));
//以下判断本次丑数是从哪一项来的,则哪一项对应的索引加一:实质上相当于三个指针往后指
if(ua == dp[i]){
a++;
}
if(ub == dp[i]){
b++;
}
if(uc == dp[i]){
c++;
}
}
return dp[n - 1];
}
}
总结
暂时没有总结,待续。。。