[LeetCode][Java][JavaScript]Super Ugly Number

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 };

 

 

posted @ 2015-12-03 14:11  `Liok  阅读(2243)  评论(0编辑  收藏  举报