[路飞]_313. 超级丑数

122 阅读2分钟

「这是我参与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];
};

如果你对这道题目还有疑问的话,可以在评论区进行留言;