您的位置:首页 > 编程语言 > Java开发

LeetCode-313. Super Ugly Number (JAVA)超级丑数

2017-04-29 23:51 357 查看

313. 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.

(4) The nth super ugly number is guaranteed to fit in a 32-bit signed integer.

与丑数不同的是,之前求丑数是从2,3,5中找,而本题是给定的质数,求出他们的倍数的超级丑数

质数集合可以任意给定,由于我们不知道质数的个数,我们可以用一个idx数组来保存当前的位置,然后我们从每个子链中取出一个数,找出其中最小值,然后更新idx数组对应位置,注意有可能最小值不止一个,要更新所有最小值的位置

参考:

 LeetCode-263.264. Ugly Number  (JAVA)丑数

public int nthSuperUglyNumber(int n, int[] primes) {
int[] dp = new int
;
// 第一个超级丑数是1
dp[0] = 1;
int[] idxPrimes = new int[primes.length];
int counter = 1;
while (counter < n) {
int min = Integer.MAX_VALUE;
for (int i = 0; i < primes.length; i++) {
// idxPrimes[i]代表每个丑数的个数,
// 比如丑数2题目的2,3,5,
// idxPrimes[0]代表2的下标
// idxPrimes[1]代表3的下标
// idxPrimes[2]代表5的下标
int temp = dp[idxPrimes[i]] * primes[i];
min = min < temp ? min : temp;
}
// 如果min和 dp[idxPrimes[i]] * primes[i]相等,
// 则其对应的下标++
for (int i = 0; i < primes.length; i++) {
if (min == dp[idxPrimes[i]] * primes[i]) {
idxPrimes[i]++;
}
}
dp[counter] = min;
counter++;
}
return dp[n - 1];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息