一、题目
超级丑数 是一个正整数,并满足其所有质因数都出现在质数数组 primes
中。
给你一个整数 n
和一个整数数组 primes
,返回第 n
个 超级丑数 。
题目数据保证第 n
个 超级丑数 在 32-bit
带符号整数范围内。
点击查看原题
难度级别: 中等
二、思路
1)动态规划
建立一个数组dp[i]
代表第i
个超级丑数的值,建立products[j]
数组和points[k]
数组,每次在products
数组中找到最小值即当前遍历到的超级丑数,points[j]
自增,products[j]
中的新值为primes[j]*dp[``points[j]``]
(为了防止数组中的值重复,每次都要遍历products
中,看是否有重复数据,有就后移指针,并更新products
对应位置的值)
三、代码
1)动态规划
class Solution {
public int nthSuperUglyNumber(int n, int[] primes) {
int[] dp = new int[n + 1];
dp[1] = 1;
int[] points = new int[primes.length];
int[] products = new int[primes.length];
for (int i = 0; i < primes.length; i++) {
points[i] = 1;
products[i] = primes[i];
}
for (int i = 2; i <= n; i++) {
int minLoc = 0;
for (int j = 1; j < products.length; j++) {
if (products[j] < products[minLoc]) {
minLoc = j;
}
}
dp[i] = products[minLoc];
for (int j = 0; j < products.length; j++) {
if (dp[i] == products[j]) {
points[j]++;
products[j] = dp[points[j]] * primes[j];
}
}
}
return dp[n];
}
}
m
为primes
的长度,时间复杂度为O(n*m)
,空间复杂度为O(n+2*m)