题目:Super Ugly Number
原题链接:https://leetcode.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. 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 ≤ 10^6, 0 < primes[i] < 1000.
设计算法找出第 n 个超级丑数。
超级丑数:给出一串列表的素数,因子只有这些素数的正整数为超级丑数。
例如:素数列表[2, 7, 13, 19],那么[1, 2, 4, 7, 8, 13, 14, 16, 19, 26, 28, 32] 就是这些素数的前12个超级丑数。
注意:1永远是是所有任何素数表的超级丑数,题目保证给出的素数表有序递增,素数表的长度不超过100,查询的丑数个数在10^6以内,素数表中的素数不超过1000.
设数组index[ primes.size() ],dp[ n ],index[ i ]表示当前primes[ i ]应该要和dp中的哪个下标相乘,dp[ i ]表示第 i 个超级丑数。初始index都置0,dp[ 0 ] = 1,设cur = 1表示当前求第 cur + 1个丑数。
对于dp从下标1开始循环:
设当前循环到dp[ cur ],令dp[ cur ] = INT_MAX,然后遍历index数组,每次用dp[ index[ i ] ] * primes[ i ],如果结果小于dp[ cur ],则令dp[ cur ] 等于当前数值,并记录 i,最后选出最小的数值,令index[ i ]++,然后判断dp[ cur ]是否等于dp[ cur - 1 ],如果不等于,则表示这是第cur + 1个超级丑数,并令cur++,否则继续循环。一直循环到cur == n为止,dp[ n - 1 ]就是结果。
代码如下:
class Solution {
public:
int nthSuperUglyNumber(int n, vector<int>& primes) {
int index[primes.size()] = {0};
int dp[n], cur = 1;
dp[0] = 1;
while(cur < n) {
int minIndex, temp;
dp[cur] = INT_MAX;
for(int i = 0; i < primes.size(); ++i){
temp = dp[index[i]] * primes[i];
if(temp < dp[cur]){
dp[cur] = temp;
minIndex = i;
}
}
index[minIndex]++;
if(dp[cur] != dp[cur - 1]) {
cur++;
}
}
return dp[n - 1];
}
};