「这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战」
313. 超级丑数
超级丑数 是一个正整数,并满足其所有质因数都出现在质数数组 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] 中。
「示例3:」
输入:a = 1, b = 8, c = 8
输出:8
解释:最优的一组操作是连续从第二和第三堆取 8 回合,直到将它们取空。
注意,由于第二和第三堆已经空了,游戏结束,不能继续从第一堆中取石子。
「提示: 」
- 1 <= n <= 106
- 1 <= primes.length <= 100
- 2 <= primes[i] <= 1000
- 题目数据 保证 primes[i] 是一个质数
- primes 中的所有值都 互不相同 ,且按 递增顺序 排列
解题思路
1. 由题意我们可以得知,题目让我们取丑数数组的第n个数,所以我们就要生成一个由n个数组成的丑数数组
2. 题目的质因数也是一个变量数组,我们要根据不同值的质因数来生成一个数组
3. 我们可以new一个数组,这个数组一共有n个值,每个值的初始值都是丑数的默认值1
4. 我们再生成一个指针数组,数组的长度根据质因数数组的长度来定,默认值都是0
5. 质因数肯定是这个丑数数组里面的最小值,把它放入一个数组里面
6. 我们再遍历质因数数组,获取一个最小值,并且更新指针的位置
7. 最后我们返回结果数组的第n - 1个值即可
代码实现
/**
* 313. 超级丑数
* @param {number} n
* @param {number[]} primes
* @return {number}
*/
var nthSuperUglyNumber = function (n, primes) {
let arr = new Array(n).fill(1);
let cur = new Array(primes.length).fill(0);
let nums = [...primes];
for (let i = 1; i < n; i++) {
let min = Math.min(...nums);
arr[i] = min;
for (let j = 0; j < primes.length; j++) {
if (min == nums[j]) {
cur[j]++;
nums[j] = arr[cur[j]] * primes[j];
}
}
}
// console.log(arr);
return arr[n - 1];
};
如果你对这道题目还有疑问的话,可以在评论区进行留言;