leetcode313. 超级丑数

超级丑数 是一个正整数,并满足其所有质因数都出现在质数数组 primes 中。

给你一个整数 n 和一个整数数组 primes ,返回第 n 个 超级丑数 。

题目数据保证第 n 个 超级丑数 在 32-bit 带符号整数范围内。

示例 1:

输入: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] 。

示例 2:

输入:n = 1, primes = [2,3,5]
输出:1
解释:1 不含质因数,因此它的所有质因数都在质数数组 primes = [2,3,5] 中。
 

提示:

  • 1 <= n <= 105
  • 1 <= primes.length <= 100
  • 2 <= primes[i] <= 1000
  • 题目数据 保证 primes[i] 是一个质数
  • primes 中的所有值都 互不相同 ,且按 递增顺序 排列
/**
 * @param {number} n
 * @param {number[]} primes
 * @return {number}
 */
//  res :存储当前的超级丑数,结果数组
//  pointers:记录当前所有素因子对应的各个指针,有几个素因子就对应的有几个指针,指向结果数组res的下标,初始都指向下标1(废弃res[0])
//  nums:记录 指针指向res的超级丑数 乘以 对应的素因子的乘积,(用重复的丑数,没有去重)
//  取nums里面的最小丑数,作为当前元素存放在res里面,看看当前元素是由哪个素因子乘积得来,对应的 pointers指针往前移动
var nthSuperUglyNumber = function(n, primes) {
    let res = new Array(n + 1).fill(1),pointers = new Array(primes.length).fill(1),nums = [];
    // 外层遍历填充res数组
    for(let i = 2;i <= n; i++){
        // 内层循环1:计算当前指针对应的丑数 * 当前指针指向的素因子
        for(let j = 0; j < primes.length;j++){
            nums[j] = res[pointers[j]] * primes[j]; 
        }
        res[i] = Math.min(...nums);
        // 内层循环2:找到res[i]对应指针,指针移动
        for(let k = 0; k < nums.length;k++){
            if(nums[k] == res[i]) pointers[k]++;
        }
        nums = [];
    }
    return res[n];
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值