1. 丑数

把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。

  1. 示例:
  2. 输入: n = 10
  3. 输出: 12
  4. 解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。

思路:

  • 每个丑数 = 比其小的丑数 * 某个丑数因子(2,3,5)
    class Solution {
      public int nthUglyNumber(int n) {
          // 使用动态规划
          // 丑数因子  2, 3, 5
          int a = 0, b = 0, c = 0; // 三个指针分别指向乘以某个因子刚好大于当前丑数的某个较小丑数
          int[] dp = new int[n];
          dp[0] = 1;
          for(int i=1;i<n;i++){
              int dp2 = dp[a] * 2, dp3 = dp[b] * 3, dp5 = dp[c] * 5;
              dp[i] = Math.min(Math.min(dp2,dp3),dp5);
              if(dp[i] == dp2) a++;
              if(dp[i] == dp3) b++;
              if(dp[i] == dp5) c++;
          }
          return dp[n-1];
      }
    }