题目链接:https://leetcode.cn/problems/get-kth-magic-number-lcci/
题目大意:给出k
,求第k
个【仅以1,3,5,7这几个数之内的数为质因数的正整数】,前几个为1,3,5,7,9,15,21…
思路:这种数叫丑数。某个丑数必定是由一个小一点的丑数乘1或3或5或7得到的。因此维护3个指针p3, p5, p7
,代表即将被3/5/7乘的那个丑数的位置。起始的丑数数列为{1}
,3个指针都指向1
,随后,比较被乘后的丑数e3, 35, e7
的大小,最小的那个放入丑数数列末尾,并将相应的指针右移一位。
这里需要注意的是:有可能会出现两个被乘的结果相同的情况,如3*5 == 5*3
,此时p3
和p5
都需要右移一个,因为它们代表的是同一个被乘的结果15
,这个数字只会被加入数列一次。
另外,因为k
是从1
开始的,不放在数列前加一个dummy head0
,这样dp[k]
就是第k
个丑数。
class Solution {
public:
int getKthMagicNumber(int k) {
vector<int> dp(k+1);
dp[1] = 1;
int p3 = 1, p5 = 1, p7 = 1;
for (int i = 2; i <= k; i++) {
int e3 = dp[p3]*3, e5 = dp[p5]*5, e7 = dp[p7]*7;
dp[i] = min(min(e3, e5), e7);
if (dp[i] == e3)
p3++;
if (dp[i] == e5)
p5++;
if (dp[i] == e7)
p7++;
}
return dp[k];
}
};