leetcode-264.丑数II

题目描述:

  1. 给一个整数n,找出并返回 第 n 个 丑数。
  2. 丑数 就是 只包含质因数 2、3 和/或 5 的正整数。

示例一:

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

示例二:

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

来源:力扣(LeetCode)

题解:

官方题解


class Solution {
     
    public int nthUglyNumber(int n) {
     
        int[] dp = new int[n + 1];
        dp[1] = 1;                         //丑数数组中第一个丑数1
        int p2 = 1, p3 = 1, p5 = 1;        //设置三个指针
        for (int i = 2; i <= n; i++) {
     
            int num2 = dp[p2] * 2, num3 = dp[p3] * 3, num5 = dp[p5] * 5;
            							   //×2、3、5 比较大小
            dp[i] = Math.min(Math.min(num2, num3), num5);
            
//添加到数组的数字如果和 num_ 相等,此处丑数×对应数字已添加。指针可以移到下一个位置
            if (dp[i] == num2) {
     
                p2++;
            }
            if (dp[i] == num3) {
     
                p3++;
            }
            if (dp[i] == num5) {
     
                p5++;
            }
        }
        return dp[n];
    }
}

丑数:丑数是由 【(0 ~ 无穷个) 2 ✖ (0 ~ 无穷个) 3 ✖ (0 ~ 无穷个) 5】得到的。
例如:【2:一个2,0个3和5】,【9:2个3,0个2和5】,【10:一个2,一个5,0个3】
所以一个丑数乘以 2 / 3 / 5 一定是丑数。

1)数组中第一个丑数是1。
2)一个丑数 ×2、3、5 都会产生一个新的丑数。
3)为了可以从小到大的将丑数添加到数组中,可以将已有的丑数 ×2、3、5 然后再比较大小后添加到数组中。

4)初始数组【1】1×2、3、5比较后,2会被添加到数组中,数组变成【1,2】,此时添加下一个丑数时是 2×2 和 1×3、1×5比较,【所以应该设置三个指针用于指示2、3、5分别该 × 数组【?】】,乘过就+1。即代码中的if (dp[i] == num2) p2++;

你可能感兴趣的:(算法,算法)