1. 程式人生 > 其它 >LeetCode——313. 超級醜數(Java)

LeetCode——313. 超級醜數(Java)

題目描述

題幹:
超級醜數 是一個正整數,並滿足其所有質因數都出現在質數陣列 primes 中。
給你一個整數 n 和一個整數陣列 primes ,返回第 n 個 超級醜數 。
題目資料保證第 n 個 超級醜數 在 32-bit 帶符號整數範圍內。

示例 1:
輸入:n = 12, primes = [2,7,13,19]
輸出:32 
解釋:給定長度為 4 的質數陣列 primes = [2,7,13,19],
前 12 個超級醜數序列為:[1,2,4,7,8,13,14,16,19,26,28,32] 。

示例 2:
輸入:n = 1, primes = [2,3,5]
輸出:1
解釋:1 不含質因數,因此它的所有質因數都在質數陣列 primes = [2,3,5] 中。

題解思路

返回第 n 個超級醜數,醜數是隻包含質因子2,3和5的數稱作醜數,第一個醜數為 1

這裡的超級醜數還要求了除了 2,3,5 之外的質因數必須存在在primes陣列中

這裡我們必須知道一個規則,一個醜數和另外一個數相乘的結果還是醜數

於是我們可以根據這個規律依次得到滿足條件的醜數,最後輸出第 n 個

正確程式碼

    // 小根堆
    public int nthSuperUglyNumber(int n, int[] primes) {
        Set<Long> longHashSet = new HashSet<>();
        PriorityQueue<Long> heap = new PriorityQueue<>();
        // 首先放入第 1 個醜數
        longHashSet.add(1L);
        heap.offer(1L);
        int ugly = 0;
        // 依次得到順序醜數並返回第 n 個
        for (int i = 0; i < n; i++) {
            long curr = heap.poll();
            ugly = (int) curr;
            for (int prime : primes) {
                long next = curr * prime;
                if (longHashSet.add(next)) {
                    heap.offer(next);
                }
            }
        }
        return ugly;
    }

總結

這裡採用小根堆每次迴圈都額外增加了不用的計算消耗,如果採用動態規劃的方法

宣告一個數只儲存下一個醜數這樣會大大節省空間和後期維護的成本

如果文章存在問題或者有更好的題解,歡迎在評論區斧正和評論,各自努力,你我最高處見