一、题目
超级丑数 是一个正整数,并满足其所有质因数都出现在质数数组 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)
