264. 丑数 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

 

思路I:丑数都是由之前的数,与2,3,5相乘获得的 => 动态规划

复制代码
class Solution {
    public int nthUglyNumber(int n) {
        int p2 = 1, p3 = 1, p5 = 1; //指向下一个给2、3、5相乘的丑数的位置
        int[] dp = new int[n+1]; 
        dp[1] = 1;
        for(int i = 2; i <= n; i++){
            dp[i] = Math.min(dp[p2]*2, Math.min(dp[p3]*3, dp[p5]*5));
            if(dp[i] == dp[p2]*2) {
                p2++;
            }
            if(dp[i] == dp[p3]*3) { //要用3个if,因为可能存在多个最小值,比如2*3,3*2都等于6
                p3++;
            }
            if(dp[i] == dp[p5]*5) {
                p5++;
            }
        }
        return dp[n];
    }
}
复制代码

思路II:使用最小堆,每次将堆中的最小值出堆,出堆后将其*2, *3, *5的数入堆。Java中可以使用优先队列实现最小堆。

复制代码
class Solution {
    public int nthUglyNumber(int n) {
        Queue<Integer> priorityQueue = new PriorityQueue<>();
        priorityQueue.add(1);
        int count = 0;
        int curNumber = 1;
        long nextNumber;

        while(!priorityQueue.isEmpty()){
            count++;
            curNumber = priorityQueue.peek();
            while(!priorityQueue.isEmpty() && priorityQueue.peek() == curNumber) {
                priorityQueue.remove();
            }

            if(count >= n){
                break;
            }

            nextNumber = (long)curNumber * 2;
            if(nextNumber == curNumber*2) { //防止溢出
                priorityQueue.add(curNumber*2);
            }
            nextNumber = (long)curNumber * 3;
            if(nextNumber == curNumber*3) {
                priorityQueue.add(curNumber*3);
            }
            nextNumber = (long)curNumber * 5;
            if(nextNumber == curNumber*5) {
                priorityQueue.add(curNumber*5);
            }
        }
        return curNumber;
    }
}
复制代码

 

posted on   joannae  阅读(53)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示