1. 程式人生 > 其它 >醜數——最小堆;動態規劃

醜數——最小堆;動態規劃

醜數

描述

如果一個數只有質數因子235 ,那麼這個數是一個醜數。我們可以認為 1 也是一個醜數。

樣例

輸入:9
輸出:10

題解1: 動態規劃

class Solution {
    public int nthUglyNumber(int n) {
        int a = 2, b = 3, c = 5;
        int[] dp = new int[n];
        int aa = 0, bb =0, cc=0, res;
        dp[0]=1;
        for (int i = 1; i < n; i++) {
            dp[i] = Math.min(dp[aa] * a, Math.min(dp[bb]*b, dp[cc]* c));
            if(dp[i] == dp[aa]*a) aa++;
            if(dp[i] == dp[bb]*b) bb++;
            if(dp[i] == dp[cc]*c) cc++;
        }
        return dp[n-1];
    }
}

題解2: 堆+Set

PriorityQueue: 最小堆,每次可以取出堆中當前的最小丑數

Set:檢測醜數是否存在,不存在將醜數放到堆中

時間複雜度:每取出一個數,就會加入3個數,時間複雜度約等於O(3nlog(3n))

public int nthUglyNumber(int n) {
        PriorityQueue<Long> queue = new PriorityQueue<>();
        Set<Long> set = new HashSet<>();
        int[] factors = new int[]{2, 3, 5};
        queue.add(1L);
        set.add(1L);

        long min;
        for (int i = 2; i <= n; i++) {
            min = queue.poll();
            for (int factor : factors) {
                if(!set.contains(min* factor)) {
                    queue.add(min * factor);
                    set.add(min * factor);
                }
            }
        }
        min = queue.poll();
        return (int) min;
    }