[路飞]_面试题 17.09. 第 k 个数

348 阅读2分钟

题目介绍

有些数的素因子只有 3,5,7,请设计一个算法找出第 k 个数。注意,不是必须有这些素因子,而是必须不包含其他的素因子。例如,前几个数按顺序应该是 1,3,5,7,9,15,21。

示例 1:

输入: k = 5

输出: 9 通过次数15,300提交次数27,862

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/ge… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

  • 数组第一个位是1
  • 初始化p3,p5,p7在数组的下标值为0
  • 通过while把数组下一位压入,直到数组的长度为k,
  • 每次循环,p3,p5,p7对应的值都*所在数组下标对应值 如(arr[p3] * 3, arr[p5] * 5)找到三个中最小的值,压入到数组中,并把当前最小值的对应的下标值向前移动一位

推导过程

arr = [1]
p3 = 0, p5 = 0, p7 =0
3 * 1 = 3, 5 * 1 = 5, 7 * 1 = 7

arr = [1, 3]
p3 = 1 p5 = 0 p7 = 0
3 * 3 = 9, 5 * 1 = 5, 7 * 1 = 7

arr = [1, 3, 5]
p3 = 1 p5 = 1 p7 = 0
3 * 3 = 9, 5 * 3 = 15, 7 * 1 = 7

arr = [1, 3, 5, 7]
p3 = 1 p5 = 1 p7 = 1
3 * 3 = 9, 5 * 3 = 15, 7 * 3 = 21

arr = [1, 3, 5, 7, 9]
p3 = 2 p5 = 1 p7 = 1
3 * 5 = 15, 5 * 3 = 15, 7 * 3 = 21

arr = [1, 3, 5, 7, 9, 15]
p3 = 3 p5 = 2 p7 = 1
3 * 7 = 21, 5 * 5 = 25,  7 * 3 = 21

arr = [1, 3, 5, 7, 9, 15, 21]
p3 = 4 p5 = 2 p7 = 2
3 * 9 = 27 5 * 5 = 25, 7 * 5 = 35

代码

/**
 * @param {number} k
 * @return {number}
 */
var getKthMagicNumber = function(k) {
    let arr = [1]
    let p3 = 0, p5 = 0, p7 = 0
    while(arr.length < k) {
        let ans = 3 * arr[p3]
        ans = Math.min(ans, 5 * arr[p5])
        ans = Math.min(ans, 7 * arr[p7])
        if (arr[p3] * 3 === ans) p3++
        if (arr[p5] * 5 === ans) p5++
        if (arr[p7] * 7 === ans) p7++
        arr.push(ans)
    }
    return arr[arr.length - 1]
};