本文主要是介绍313超级丑数(动态规划多指针),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1、题目描述
编写一段程序来查找第 n 个超级丑数。
超级丑数是指其所有质因数都是长度为 k 的质数列表 primes 中的正整数。
说明:
- 1 是任何给定 primes 的超级丑数。
- 给定 primes 中的数字以升序排列。
- 0 < k ≤ 100, 0 < n ≤ 106, 0 < primes[i] < 1000 。
- 第 n 个超级丑数确保在 32 位有符整数范围内。
2、示例
输入: n = 12, primes = [2,7,13,19]
输出: 32
解释: 给定长度为 4 的质数列表 primes = [2,7,13,19],前 12 个超级丑数序列为:[1,2,4,7,8,13,14,16,19,26,28,32] 。
3、题解
基本思想:动态规划多指针,参考题号264。为每个质因数建立一个指针,然后再这几个质因数运算的结果中,找出个最小的,然后匹配这个数是由哪个质因数算出来的,把它的指针值+1。
#include<iostream>
#include<vector>
#include<algorithm>
#include<map>
#include<list>
using namespace std;
class Solution {
public:int nthSuperUglyNumber(int n, vector<int>& primes) {//基本思想:动态规划多指针,参考题号264//为每个质因数建立一个指针,然后再这几个质因数运算的结果中,找出个最小的,然后匹配这个数是由哪个质因数算出来的,把它的指针值+1。vector<int> index(primes.size(),0);vector<int> num = { 1 };for(int i=1;i<n;i++){int cur=INT_MAX;for(int j=0;j<index.size();j++){if(num[index[j]]*primes[j]<cur)cur=num[index[j]]*primes[j];}num.push_back(cur);for(int j=0;j<index.size();j++){if(num[index[j]]*primes[j]==cur)index[j]++;}}return num.back();}
};
int main()
{int n=12;vector<int> primes={2,7,13,19};Solution solute;cout<<solute.nthSuperUglyNumber(n,primes)<<endl;return 0;
}
这篇关于313超级丑数(动态规划多指针)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!