解题思路
- 首先要知道什么是素因子 素数也称质数,就是除了1和本身以外不再有别的约数。 那么有些数可以写出几个素数相乘的合数,这些素数称为合数的素因子
结论: 那些数 就是 3,5,7 为素因子的合数。
- 利用3指针获取他们不同的合数 设3个指针都指向数组的第一个位置, 每个指针都取所对应数组中的素数让它与 3,5,7 相乘取最小合数作为下一个位置的值, 当遇到合数的素因子为3,5,7三个指针时,素因子的指针位数+1
1
[0][1][2][3][4][5][6][7][8]
3
5
7
// dp[1]的合数为 3,5,7,取最小一个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]的合数为 9,5,7,取最小一个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]的合数为 9,15,7,取最小一个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]的合数为 9,15,21,取最小一个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]的合数为 15,15,21,取最小一个15,因为3,5是合数的素因子,所以3,5往前移一位
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];
};