丑数 II 力扣(动态规划)JAVA

给你一个整数 n ,请你找出并返回第 n 个 丑数 。

丑数 就是只包含质因数 2、3 和/或 5 的正整数。

示例 1:

输入:n = 10
输出:12
解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。

示例 2:

输入:n = 1
输出:1
解释:1 通常被视为丑数。

提示:

1 <= n <= 1690

解题思路:

1、一个数是丑数,那么这个数 * 2* 3* 5仍然是丑数,可以用动态规划解题

2、初始值 dp[1] = 1

3、设立三个指针p1、p2、p3从1开始指向,分别代表dp[p1] * 2, dp[p2] * 3, dp[p3] *5选取最新小值并移动对应指针即可

代码:

class Solution {
    public int nthUglyNumber(int n) {
          int dp[] = new int [n + 1];
          dp[1] = 1;
          int p1 = 1, p2 = 1, p3 = 1;
          for(int i = 2; i <= n; i ++) {
        	  dp[i] = Math.min(dp[p1] * 2, Math.min(dp[p2] * 3, dp[p3] * 5));
        	  if(dp[i] == dp[p1] * 2) p1 ++;
        	  if(dp[i] == dp[p2] * 3) p2 ++;
        	  if(dp[i] == dp[p3] * 5) p3 ++;
          }
          return dp[n];
    }
}

在这里插入图片描述
注意:不能用if else语句因为6 * 2 = 4 * 3 = 12,此时就不光光只有一个指针移动了。

你可能感兴趣的:(leetcode,动态规划,java)