【LeetCode】313. Super Ugly Number 超級醜數(Medium)(JAVA)
阿新 • • 發佈:2020-12-16
技術標籤: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 位有符整數範圍內。
解題方法
- 這一題是 2,3,5 那一題醜數的進階版,只是把 2,3,5 替換成了一系列質數
- 把第 i 位置是什麼用一個 dp 函式記錄下來
- 再建立一個數組 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使用者