题目描述
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
.
题目大意
给一组素数,要求找到以这组素数中任意数字为因子的第n小的数字(认定第一个数字一定为1)。
示例
E1
解题思路
一个数组res保存前n小的数字,另一个数组pos保存primes中的素数的倍数,依次递乘计算第i小的数字,最后一个数字即为所求的第n小的数字。
复杂度分析
时间复杂度:O(N * K)
空间复杂度:O(N)
代码
class Solution { public: int nthSuperUglyNumber(int n, vector<int>& primes) { int k = primes.size(); // 保存前n小的数字 vector<int> res(n); // 保存第i个primes的乘积 vector<int> pos(k, 0); res[0] = 1; for(int i = 1; i < n; ++i) { int tmp = INT_MAX; // 取第i小的数字 for(int j = 0; j < k; ++j) tmp = min(tmp, res[pos[j]] * primes[j]); // 若该数字是primes中某素数的乘积,则pos[j]加一 for(int j = 0; j < k; ++j) { if(tmp == res[pos[j]] * primes[j]) pos[j]++; } res[i] = tmp; } return res[n - 1]; } };