题目
来源:第k个数
有些数的素因子只有 3,5,7,请设计一个算法找出第 k 个数。注意,不是必须有这些素因子,而是必须不包含其他的素因子。例如,前几个数按顺序应该是 1,3,5,7,9,15,21。
示例
解题思路及代码
1. 思路
初步思路:有一些数,其因数中一定至少有 3 5 7中的一个。找到这些数中的第k个数。创建长度为k的数组,将符合条件的数放入数组中,返回数组最后一个数。
精选题解思路:其实我在想,为什么可以用动态规划。。。
为什么可以用三个指针?
将上述符合条件的数称为丑数。第一个丑数 1 x3/x5/x7会得到新的3个丑数,这三个丑数分别再x3/x5/x7,又可以得到9个丑数,所以这些丑数集合,其实可以看做三个丑数子集合的组合,第一个丑数不断x3形成的一个子集合,以及第一个丑数不断x5,x7形成的子集合。
创建dp数组,dp[n]代表第n个满足题意的数。同时创建三个指针,p3指向的数始终乘以3,p5指向的数始终乘以5,p7 指向的数始终乘以7。因为丑数集合按顺序排列,所以每次往dp数组中添加元素时,都会选择三个指针指向的数中最小的那个。
2. 代码
var getKthMagicNumber = function(k) {
var p3 = 0;
var p5 = 0;
var p7 = 0;
var dp = new Array(k);
dp[0] = 1;
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];
};