[leetcode]313. Super Ugly Number

本文介绍了一种高效算法来寻找第N个超丑数。超丑数是指所有质因数都在给定质数列表中的正整数。文中详细解释了如何使用动态规划的方法逐步构建超丑数序列,并给出了完整的C++实现代码。

题目链接:https://leetcode.com/problems/super-ugly-number/#/description


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. For example, [1, 2, 4, 7, 8, 13, 14, 16, 19, 26, 28, 32] is the sequence of the first 12 super ugly numbers given primes = [2, 7, 13, 19] of size 4.

Note:
(1) 1 is a super ugly number for any given primes.
(2) The given numbers in primes are in ascending order.
(3) 0 < k ≤ 100, 0 < n ≤ 106, 0 < primes[i] < 1000.
(4) The nth super ugly number is guaranteed to fit in a 32-bit signed integer.


思路:dp[ i ]代表第i个 super ugly number,index[ i ]代表primes里面的第i个数要与dp里的第index[ i ]个数相乘,下一个质数就是dp[ index[ i ] ]*primes[ i ]中的最小值,

          记录dp[ index[ i ] ]*primes[ i ]中的最小值中 minIndex=i,因为dp[ index[ mindex] ]*primes[ minindex]已经相乘,所以index[ minIndex ]++。又因为

          dp[ index[ mindex] ]*primes[ minindex]可能会与dp里最后一个元素相同,所以要跳过这种情况。


class Solution {
public:
    int nthSuperUglyNumber(int n, vector<int>& primes) {
        vector<int> index(primes.size(),0);
        vector<int> dp(n,0);
        dp[0]=1;
        int cur=1;
        int minIndex=0;
        int len=primes.size();
        while(cur<n)
        {
            int minValue=INT_MAX;
            for(int i=0;i<len;i++)
            {
                int tmp=dp[index[i]]*primes[i];
                if(tmp<minValue)
                {
                    minValue=tmp;
                    minIndex=i;
                }
            }
            index[minIndex]++;
            if(dp[cur-1]!=minValue)
            {
                dp[cur]=minValue;
                cur++;
            }
        }
        return dp[cur-1];
    }
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值