【力扣:313】超级丑数

【力扣:313】超级丑数_第1张图片

题目解读:可以primes中任意位置任意数量数据(可以选取0个,此时乘积为1)进行相乘取结果中第n小的数
思路:

  1. 由优先级队列维护的dp,每次取最小的数min,将其pop掉后插入minprimes[i],循环n次(维护成本高,时间复杂度为O(n mlog2n)超时)
  2. 数组维护dp,使用数组存储待排序值,使用数组存储待排序数组每个位置下一次应乘第几小的数,整个过程循环n次每次取其中最小的值为dp[i]赋值,而后将最小位的数修改
class Solution {
public:
    int nthSuperUglyNumber(int n, vector<int>& primes) {
        vector<long>dp(n+1);
        int size=primes.size();
        vector<int>index(size);
        vector<long>num(size,1);
        for(int i=1;i<=n;i++){
            long val=INT_MAX;
            for(long j:num) val=min(val,j);
            dp[i]=val;
            for(int j=0;j<size;j++){
                if(num[j]==val){
                    index[j]++;
                    num[j]=dp[index[j]]*primes[j];
                }
            }
        }
        return dp[n];
    }
};

你可能感兴趣的:(leetcode,算法,动态规划)