要求
有些数的素因子只有 3,5,7,请设计一个算法找出第 k 个数。注意,不是必须有这些素因子,而是必须不包含其他的素因子。例如,前几个数按顺序应该是 1,3,5,7,9,15,21。
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/ge… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
示例
输入: k = 5
输出: 9
思路
0、List = [1,3,5,7,9,15,21]
1、素因子只有3,5,7,意思就是只能由3,5,7相乘得到的数(包括1)
2、由题目给出的前几个数(List)可以看出
1=3*0
1=5*0
1=7*0
3=3*1
5=5*1
7=7*1
9=3*3
15=3*5
21=3*7
聪明的小伙伴可能已经看出来了(本人当时并没看出来)
第二个数3,是由3 * List的下标为0的数得出来的
第三个数5,是由5 * List的下标为0的数得出来的
第四个数7,是由7 * List的下标为0的数得出来的
至此,3,5,7各用了一次
当到了9的时候,是3 * 3,即素因子3 * List[1]得到的9
当到了15的时候, 是3 * 5,即素因子3 * List[2]得到的15或素因子5 * List[1]
所以我们得到了规律
规律
算出素因子 * List[素因子的使用次数] ,然后再push进List中,就是List的下一个数
注意
有些数(比如15)是由两个素因子(3,5)相乘得到的,所以对应的两个素因子的使用次数都需要+1
图解
1、初始化,使用次数都为0,对应List的下标0,素因子各乘一次List[自身使用次数],取最小值3,放进List中,素因子3的使用次数+1
2、现在素因子3使用了一次,所以素因子3所对应的下标为List[1],然后再各乘一次List[自身使用次数],取最小值5,放进List中,素因子5的使用次数+1
3、同样各乘一次List[自身使用次数],取最小值7,放进List中,素因子7的使用次数+1
4、接着下一轮,把最小值9放进List中,3的使用次数+1,所对应的List的下标也+1
代码
/**
* @param {number} k
* @return {number}
*/
var getKthMagicNumber = function (k) {
// 定义三个变量,记录357的使用次数,定义一个数组,长度为k,用来储存从0到k个数的数组
let p3 = 0,
p5 = 0,
p7 = 0,
list = new Array(k);
// 数组的第一个数为1
list[0] = 1;
// 所以i从1开始,一直到k
for (let i = 1; i < k; i++) {
// 取最小值
list[i] = Math.min(list[p3] * 3, list[p5] * 5, list[p7] * 7);
if (list[i] === list[p3] * 3) p3++;
if (list[i] === list[p5] * 5) p5++;
if (list[i] === list[p7] * 7) p7++;
}
return list[k - 1]
};
PC
本人参考博客,如果各位看官觉得我说得不够透彻的话,可以去看看这位老哥写的博客,我是在这位老哥写的博客帮助下搞懂这道题的