超级丑数 是一个正整数,并满足其所有质因数都出现在质数数组
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];
};
标签:丑数,leetcode313,res,超级,数组,primes,质数
From: https://blog.csdn.net/Turboyiyi/article/details/142753965