Leetcode 313.超级丑数
超级丑数
编写一段程序来查找第n个超级丑数。
超级丑数是指其所有质因数都是长度为 k 的质数列表 primes 中的正整数。
示例:
输入: 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] 。
说明:
- 1 是任何给定 primes 的超级丑数。
- 给定 primes 中的数字以升序排列。
- 0 < k ≤ 100, 0 < n ≤ 106, 0 < primes[i] < 1000 。
- 第 n 个超级丑数确保在 32 位有符整数范围内。
质数集合可以任意给定,由于我们不知道质数的个数,我们可以用一个idx数组来保存当前的位置,然后我们从每个子链中取出一个数,找出其中最小值,然后更新idx数组对应位置,注意有可能最小值不止一个,要更新所有最小值的位置可以参见题解263丑数II
1 class Solution { 2 public int nthSuperUglyNumber(int n, int[] primes) { 3 int[] dp = new int[n]; 4 // 第一个超级丑数是1 5 dp[0] = 1; 6 int[] idxPrimes = new int[primes.length]; 7 int counter = 1; 8 while (counter < n) { 9 int min = Integer.MAX_VALUE; 10 for (int i = 0; i < primes.length; i++) { 11 // idxPrimes[i]代表每个丑数的个数, 12 // 比如丑数2题目的2,3,5, 13 // idxPrimes[0]代表2的下标 14 // idxPrimes[1]代表3的下标 15 // idxPrimes[2]代表5的下标 16 int temp = dp[idxPrimes[i]] * primes[i]; 17 min = min < temp ? min : temp; 18 } 19 // 如果min和 dp[idxPrimes[i]] * primes[i]相等, 20 // 则其对应的下标++ 21 for (int i = 0; i < primes.length; i++) { 22 if (min == dp[idxPrimes[i]] * primes[i]) { 23 idxPrimes[i]++; 24 } 25 } 26 dp[counter] = min; 27 counter++; 28 } 29 return dp[n - 1]; 30 } 31 }