题号:剑指 Offer 49
题目名:丑数
原题URL:https://leetcode-cn.com/problems/chou-shu-lcof/
题目描述
我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。
示例
示例 1:
输入: n = 10
输出: 12
解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。
限制
1
是丑数。n
不超过1690。
思路
1.多指针+动态规划
2.可以看到,所有数都是2,3,5的乘积的结果,那么每次选其中一个相乘,并且最小,作为第n个值
3.找到使用的是2,3还是5
解题代码
class Solution {
public int nthUglyNumber(int n) {
//丑数题,直接多指针+动态规划解决
//可以发现,丑数都是1,2,3,5,2*2,2*3,2*2*2,2*5,这样依次用2,3,5的因数去相乘
//分别是dp[1],dp[1]*2,dp[1]*3,dp[1]*5,dp[2]*2,dp[2]*3,d[2]*5,dp[5]*2,dp[2]*5
int[] dp = new int[n+1];
dp[1] = 1;
//分别指定因数为235的指针
int dp2 = 1;
int dp3 = 1;
int dp5 = 1;
for (int i = 2; i <= n; i++) {
//找到乘出来最小的数
dp[i] = Math.min(Math.min(dp[dp2]*2,dp[dp3]*3),dp[dp5]*5);
//看看用的是哪个指针,找到指针,将指针后移
if(dp[i] == dp[dp2]*2) dp2++;
if(dp[i] == dp[dp3]*3) dp3++;
if(dp[i] == dp[dp5]*5) dp5++;
}
return dp[n];
}
}