LeetCode-313 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.

 

题目大意

给一组素数,要求找到以这组素数中任意数字为因子的第n小的数字(认定第一个数字一定为1)。

 

示例

E1

Input: n = 12, primes = [2,7,13,19]
Output: 32 
Explanation: [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.

 

解题思路

一个数组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];
    }
};

 

转载于:https://www.cnblogs.com/heyn1/p/11170221.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值