[路飞]_leetcode_面 17.09 第k个数

112 阅读2分钟

解题思路

  1. 首先要知道什么是素因子 素数也称质数,就是除了1和本身以外不再有别的约数。 那么有些数可以写出几个素数相乘的合数,这些素数称为合数的素因子

结论: 那些数 就是 3,5,7 为素因子的合数。

  1. 利用3指针获取他们不同的合数 设3个指针都指向数组的第一个位置, 每个指针都取所对应数组中的素数让它与 3,5,7 相乘取最小合数作为下一个位置的值, 当遇到合数的素因子为3,5,7三个指针时,素因子的指针位数+1
 1
[0][1][2][3][4][5][6][7][8]
 3
 5
 7

// dp[1]的合数为 357,取最小一个3,因为3是合数的素因子,所以3往前移一位
 1  3
[0][1][2][3][4][5][6][7][8]
    3
 5
 7
3 * dp[p3] = 3
5 * dp[p5] = 5
7 * dp[p7] = 7

// dp[2]的合数为 957,取最小一个5,因为5是合数的素因子,所以5往前移一位
 1  3  5
[0][1][2][3][4][5][6][7][8]
    3
    5
 7
3 * dp[p3] = 9
5 * dp[p5] = 5
7 * dp[p7] = 7

// dp[3]的合数为 9157,取最小一个7,因为7是合数的素因子,所以7往前移一位
 1  3  5  7
[0][1][2][3][4][5][6][7][8]
    3
    5
    7
3 * dp[p3] =  9
5 * dp[p5] = 15
7 * dp[p7] =  7

// dp[4]的合数为 91521,取最小一个9,因为3是合数的素因子,所以3往前移一位
 1  3  5  7  9
[0][1][2][3][4][5][6][7][8]
       3
    5
    7
3 * dp[p3] =  9
5 * dp[p5] = 15
7 * dp[p7] = 21

// dp[5]的合数为 151521,取最小一个15,因为35是合数的素因子,所以35往前移一位
 1  3  5  7  9  15
[0][1][2][3][4][5][6][7][8]
          3
       5
    7
3 * dp[p3] = 15
5 * dp[p5] = 15
7 * dp[p7] = 21

以此类推

代码

var getKthMagicNumber = function(k) {
    let dp = [];
    dp[0] = 1;

    let p3 = 0;
    let p5 = 0;
    let p7 = 0;

    for (let i = 1; i < k; i++) {
        dp[i] = Math.min(dp[p3] * 3, Math.min(dp[p5] * 5, dp[p7] * 7));

        if (dp[i] == dp[p3] * 3) p3++;
        if (dp[i] == dp[p5] * 5) p5++;
        if (dp[i] == dp[p7] * 7) p7++;
    }

    return dp[k-1];
};