本题也是不难,就是有点巧,我用heap的方法做了出来,但是本题的最优解肯定是dynamic programming,所以又重新解了一遍。本题不准备过多描述,解释其实不好解释,代码是一看就懂。需要注意:

    • 同时使用4个index:2,3,5,和综合的。显而易见,5的增常最慢
    • 对于同一个global index,即同一个number,可能有264. Ugly Number II - 图1264. Ugly Number II - 图2两种可能,所以,2和5的index需要同时增加

    • 时间复杂度:264. Ugly Number II - 图3

    • 空间复杂度: 264. Ugly Number II - 图4

    代码如下:

    1. class Solution {
    2. public int nthUglyNumber(int n) {
    3. int index2 = 0;
    4. int index3 = 0;
    5. int index5 = 0;
    6. int[] dp = new int[n];
    7. dp[0] = 1;
    8. for (int idx = 1; idx < n; ++idx) {
    9. int num2 = 2 * dp[index2];
    10. int num3 = 3 * dp[index3];
    11. int num5 = 5 * dp[index5];
    12. int minVal = Math.min(num2, Math.min(num3, num5));
    13. if (minVal == num2) {
    14. dp[idx] = num2;
    15. ++index2;
    16. }
    17. if (minVal == num3) {
    18. dp[idx] = num3;
    19. ++index3;
    20. }
    21. if (minVal == num5) {
    22. dp[idx] = num5;
    23. ++index5;
    24. }
    25. }
    26. return dp[n-1];
    27. }
    28. }