有些数的素因子只有 3,5,7,请设计一个算法找出第 k 个数。注意,不是必须有这些素因子,而是必须不包含其他的素因子。例如,前几个数按顺序应该是 1,3,5,7,9,15,21。
示例 1:
输入: k = 5
输出: 9
代码
class Solution {
public:
/* 有序列表合并问题
* 题目理解:*素因子只有 3,5,7,不是必须有这些素因子,而是必须不包含其他的素因子*
* - 表示只选取素因子是 3 5 7 为因子组成的数,即3x,5x,7x的数据,注意一开始的数都为1
* 解法:
* - 设置三个有序数组,分别计算 3x,5x,7x,其第一个数都是1,
* - 当前三个有序列表各有一个指针指向当前还未出队的元素(出队的是排序好的,有序列表合并问题原型)
* - 下一个位置的x将由当前三个有序列表index指向的元素中最小的一个出队得到,计算3x 5x 7x添加到数组后方
* - 注意三个数组可能有相同的数出现,都+1出队即可
* - 如此可以简化三个数组直接为最尾端的数即可,无需保存
* */
int getKthMagicNumber(int k) {
vector<int> ans(1,1);
int p3=0,p5=0,p7=0;
for(int i=1;i<k;i++){
ans.push_back(min(min(ans[p3]*3,ans[p5]*5),ans[p7]*7));
if(ans[i]==ans[p3]*3) p3++;
if(ans[i]==ans[p5]*5) p5++;
if(ans[i]==ans[p7]*7) p7++;
}
return ans[k-1];
}
};