1. 程式人生 > 其它 >【LeetCode】313. Super Ugly Number 超級醜數(Medium)(JAVA)

【LeetCode】313. Super Ugly Number 超級醜數(Medium)(JAVA)

技術標籤:Leetcodejavaleetcode資料結構演算法面試

【LeetCode】313. Super Ugly Number 超級醜數(Medium)(JAVA)

題目地址: https://leetcode-cn.com/problems/super-ugly-number/

題目描述:

Write a program to find the nth super ugly number.

Super ugly numbers are positive numbers whose all prime factors are in the given prime list primes of size k.

Example:

Input: n = 12, primes = [2,7,13,19]
Output: 32 
Explanation: [1,2,4,7,8,13,14,16,19,26,28,32] is the sequence of the first 12 
             super ugly numbers given primes = [2,7,13,19] of size 4.

Note:

  • 1 is a super ugly number for any given primes.
  • The given numbers in primes are in ascending order.
  • 0 < k ≤ 100, 0 < n ≤ 106, 0 < primes[i] < 1000.
  • The nth super ugly number is guaranteed to fit in a 32-bit signed integer.

題目大意

編寫一段程式來查詢第 n 個超級醜數。

超級醜數是指其所有質因數都是長度為 k 的質數列表 primes 中的正整數。

說明:

  • 1是任何給定primes的超級醜數。
    *給定primes中的數字以升序排列。
  • 0 < k ≤ 100, 0 < n ≤ 106, 0 < primes[i] < 1000 。
  • 第n個超級醜數確保在 32 位有符整數範圍內。

解題方法

  1. 這一題是 2,3,5 那一題醜數的進階版,只是把 2,3,5 替換成了一系列質數
  2. 把第 i 位置是什麼用一個 dp 函式記錄下來
  3. 再建立一個數組 index,把當前元素對應在 dp 的什麼位置記錄下來(最小可能位置),後面就把 dp[index[i]] * primes[i] 的最小值,然後遍歷把所有元素的位置更新一下
class Solution {
    public int nthSuperUglyNumber(int n, int[] primes) {
        if (n == 0) return 0;
        int[] index = new int[primes.length];
        int[] dp = new int[n];
        dp[0] = 1;
        for (int i = 1; i < n; i++) {
            dp[i] = Integer.MAX_VALUE;
            for (int j = 0; j < primes.length; j++) {
                dp[i] = Math.min(dp[i], dp[index[j]] * primes[j]);
            }
            for (int j = 0; j < primes.length; j++) {
                if (dp[i] == dp[index[j]] * primes[j]) index[j]++;
            }
        }
        return dp[n - 1];
    }
}

執行耗時:29 ms,擊敗了33.29% 的Java使用者
記憶體消耗:36.6 MB,擊敗了60.46% 的Java使用者

歡迎關注我的公眾號,LeetCode 每日一題更新