目录
一,题目描述
英文描述
A super ugly number is a positive integer whose prime factors are in the array primes.
Given an integer n and an array of integers primes, return the nth super ugly number.
The nth super ugly number is guaranteed to fit in a 32-bit signed integer.
中文描述
超级丑数 是一个正整数,并满足其所有质因数都出现在质数数组 primes 中。
给你一个整数 n 和一个整数数组 primes ,返回第 n 个 超级丑数 。
题目数据保证第 n 个 超级丑数 在 32-bit 带符号整数范围内。
示例与说明
来源:力扣(LeetCode)
链接:力扣
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二,解题思路
这一题的测试用例比较复杂,采用堆的方法容易超时。这里采用动态规划的方法。
每挑选出一个丑数,更新指针对应的下一个丑数并存放在数组中,避免重复计算。
三,AC代码
C++
class Solution {
public:
int nthSuperUglyNumber(int n, vector<int>& primes) {
vector<int> index(primes.size(), 0);
vector<long> nums(primes.size(), 1);// 记录每个指针计算出的对应丑数
vector<int> ans;// 存放最终选定的丑数数组
for (int j = 0; j < n; j++) {
int minNum = INT_MAX;
for (int i = 0; i < primes.size(); i++) {
if (nums[i] < minNum) {
minNum = nums[i];
}
}
ans.push_back(minNum);
for (int i = 0; i < index.size(); i++) {
if (nums[i] == minNum) {
nums[i] = long(primes[i]) * ans[index[i]];// 更新
index[i]++;// 更新
}
}
}
return ans[n - 1];
}
};
四,解题过程
第一博
按照之前的思路,写出来个动态规划版的解法,然而超时了。。。
class Solution {
public:
int nthSuperUglyNumber(int n, vector<int>& primes) {
vector<int> index(primes.size(), 0);
vector<int> ans;
ans.push_back(1);
int num = n;
while (--num) {
int minNum = INT_MAX;
for (int i = 0; i < primes.size(); i++) {
int cur = primes[i] * ans[index[i]];
if (cur < minNum) {
minNum = cur;
}
}
ans.push_back(minNum);
for (int i = 0; i < index.size(); i++) {
if (primes[i] * ans[index[i]] == minNum) {
index[i]++;
}
}
}
return ans[n - 1];
}
};
第二搏
可以看出上面的方法中重复计算了乘法的过程,这里把计算的结果保留下来,避免重复计算:
稍微操作一下,保存之前计算过的数据。由于数据太大需要用long类型。