313. Super Ugly Number

题目:Super Ugly Number

原题链接:https://leetcode.com/problems/super-ugly-number/
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 ≤ 10^6, 0 < primes[i] < 1000.

设计算法找出第 n 个超级丑数。
超级丑数:给出一串列表的素数,因子只有这些素数的正整数为超级丑数。
例如:素数列表[2, 7, 13, 19],那么[1, 2, 4, 7, 8, 13, 14, 16, 19, 26, 28, 32] 就是这些素数的前12个超级丑数。
注意:1永远是是所有任何素数表的超级丑数,题目保证给出的素数表有序递增,素数表的长度不超过100,查询的丑数个数在10^6以内,素数表中的素数不超过1000.

设数组index[ primes.size() ],dp[ n ],index[ i ]表示当前primes[ i ]应该要和dp中的哪个下标相乘,dp[ i ]表示第 i 个超级丑数。初始index都置0,dp[ 0 ] = 1,设cur = 1表示当前求第 cur + 1个丑数。
对于dp从下标1开始循环:
设当前循环到dp[ cur ],令dp[ cur ] = INT_MAX,然后遍历index数组,每次用dp[ index[ i ] ] * primes[ i ],如果结果小于dp[ cur ],则令dp[ cur ] 等于当前数值,并记录 i,最后选出最小的数值,令index[ i ]++,然后判断dp[ cur ]是否等于dp[ cur - 1 ],如果不等于,则表示这是第cur + 1个超级丑数,并令cur++,否则继续循环。一直循环到cur == n为止,dp[ n - 1 ]就是结果。

代码如下:

class Solution {
public:
    int nthSuperUglyNumber(int n, vector<int>& primes) {
        int index[primes.size()] = {0};
        int dp[n], cur = 1;
        dp[0] = 1;
        while(cur < n) {
            int minIndex, temp;
            dp[cur] = INT_MAX;
            for(int i = 0; i < primes.size(); ++i){
                temp = dp[index[i]] * primes[i];
                if(temp < dp[cur]){
                    dp[cur] = temp;
                    minIndex = i;
                }
            }
            index[minIndex]++;
            if(dp[cur] != dp[cur - 1]) {
                cur++;
            }
        }
        return dp[n - 1];
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值