Description

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.

Example:

Input:

n = 12, primes = [2,7,13,19]

Output:

32 

Explanation:

[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 is a super ugly number for any given primes.
  • The given numbers in primes are in ascending order.
  • 0 < k ≤ 100, 0 < n ≤ 106, 0 < primes[i] < 1000.
  • The nth super ugly number is guaranteed to fit in a 32-bit signed integer.

分析

题目的意思是:求一个数的第n个超级丑数。

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

代码

class Solution {
public:
int nthSuperUglyNumber(int n, vector<int>& primes) {
vector<int> dp(n,INT_MAX);
vector<int> count(primes.size(),0);
dp[0]=1;
for(int i=1;i<n;i++){
for(int j=0;j<primes.size();j++){
dp[i]=min(dp[i],dp[count[j]]*primes[j]);
}
for(int j=0;j<primes.size();j++){
if(dp[i]==dp[count[j]]*primes[j]){
count[j]++;
}
}
}
return dp[n-1];
}
};

参考文献

​[LeetCode] Super Ugly Number 超级丑陋数​