思路
思路与丑数和丑数||中丑数||的思路完全一致,只不过原本的质数范围只是【2,3,5】,现在是一个最长为1000的数组,所以原本使用的三指针方法。直接转换为m指针方法就可以了。
时间复杂度为 O ( n m ) O(nm) O(nm),其中m为数组primes的长度。
代码
class Solution {
public int nthSuperUglyNumber(int n, int[] primes) {
//开始进行动态规划
int[] dp = new int[n+1];
dp[0]=1;
dp[1]=1;
//设置m个指针,然后初始化为1
int[] c = new int[primes.length];
Arrays.fill(c,1);
for (int i=2;i<=n;i++)
{
int min = Integer.MAX_VALUE;
//每次找到最小的
for (int j=0;j<primes.length;j++)
{
min = Math.min(min,dp[c[j]]*primes[j]);
}
//把对应的指针+1
for (int j=0;j<primes.length;j++)
{
if (min==(dp[c[j]]*primes[j]))
{
c[j]++;
}
}
//找到的最小值即为第i个超级丑数
dp[i] = min;
}
return dp[n];
}
}