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
. For example, [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) 1
is a super ugly number for any given primes
.
(2) The given numbers in primes
are in ascending order.
(3) 0 < k
≤ 100, 0 < n
≤ 106, 0 < primes[i]
< 1000.
https://leetcode.com/problems/super-ugly-number/
和Ugly Number II一样的思路。
动态规划,ugly number肯定是之前的ugly number乘以primes中的其中一个数得到的。
结果存在dp数组中,每一个dp中的数都要乘以primes中的数,寻找所有的结果,也就是说primes中的每一个数都需要一个变量记录位置。
举例来说primes : [2, 5, 7]。
一开始2, 5, 7都指向0的位置。
每一轮循环都用2, 5, 7与当前位置的数相乘,把最小的放进dp数组中。
Java:
1 public static int nthSuperUglyNumber(int n, int[] primes) { 2 int[] dp = new int[n + 1], prime = new int[primes.length]; 3 int dpIndex = 1, minIndex = -1; 4 dp[0] = 1; 5 while(dpIndex <= n){ 6 int min = Integer.MAX_VALUE; 7 for(int i = 0; i < primes.length; i++){ 8 int tmp = dp[prime[i]] * primes[i]; 9 if(tmp < min){ 10 min = tmp; 11 minIndex = i; 12 } 13 } 14 prime[minIndex]++; 15 if(min != dp[dpIndex - 1]){ 16 dp[dpIndex] = min; 17 dpIndex++; 18 } 19 } 20 return dp[n - 1]; 21 }
JavaScript:
1 /** 2 * @param {number} n 3 * @param {number[]} primes 4 * @return {number} 5 */ 6 var nthSuperUglyNumber = function(n, primes) { 7 var i, dp = [1], prime = [], dpIndex = 1, tmp, min, minIndex; 8 for(i = 0; i < primes.length; i++) prime[i] = 0; 9 while(dpIndex <= n){ 10 min = Infinity; 11 for(i = 0; i < primes.length; i++){ 12 tmp = dp[prime[i]] * primes[i]; 13 if(tmp < min){ 14 min = tmp; 15 minIndex = i; 16 } 17 } 18 prime[minIndex]++; 19 if(min !== dp[dpIndex - 1]){ 20 dp[dpIndex] = min; 21 dpIndex++; 22 } 23 } 24 return dp[n - 1]; 25 };