剑指 Offer 第49题:丑数

2022-08-08  本文已影响0人  放开那个BUG

1、前言

题目描述

2、思路

本题如果一个个判断的话,会超时。所以应该想的是,基本的底是2、3、5,那么我们可以从 1 开始,不断从小根堆中取出堆顶元素,然后乘2、3、5放入堆中。为了防止放了重复的数,可以使用 set 记录一下是否已经放过。

还要注意一点,为了防止溢出,需要 long 而不是 int。

3、代码

class Solution {
    public int nthUglyNumber(int n) {
        int[] arr = new int[]{2, 3, 5};

        Set<Long> set = new HashSet<>();
        Queue<Long> priorityQueue = new PriorityQueue<>();
        set.add(1l);
        priorityQueue.add(1l);

        for(int i = 1; i <= n; i++){
            long num = priorityQueue.poll();
            if(i == n){
                return (int)num;
            }

            for(int a : arr){
                long t = num * a;
                if(!set.contains(t)){
                    set.add(t);
                    priorityQueue.add(t);
                }
            }
        }

        return -1;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读