编写一个程序,找出第 n 个丑数。
丑数就是只包含质因数 2, 3, 5 的正整数。
示例:
输入: n = 10
输出: 12
解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。
说明:
1 是丑数。
n 不超过1690。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ugly-number-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
int nthUglyNumber(int n) {
int *dp = new int[n];
for(int i = 0; i < n; ++i) {
dp[i] = 1;
}
int index[3] = {0,0,0};
for(int i = 1; i < n; ++i) {
// 为什么是dp[index[i]],而不是直接index[i]增加,
// index[i]直接递增无法确保index[i]就是丑数,比如index[i]增加到7的时候就不是丑数
// index[0]、index[1]、index[2]分别是2、3、5的权值,该权值需要在需要一直递增而且是丑数,
// 因此就可以直接作为dp的下标来获取不断递增的丑数
int x = 2 * dp[index[0]];
int y = 3 * dp[index[1]];
int z = 5 * dp[index[2]];
int temp = min(x, min(y, z));
// 易错点,不能写if else
// 可能存在x,y,z相等的情况
// eg: 2 * 3 = 6 和 3 * 2 = 6这种情况,这样两者的下标值都要增加(否则会出现重复的数值)
if(temp == x) {
++index[0];
}
if(temp == y) {
++index[1];
}
if(temp == z) {
++index[2];
}
dp[i] = temp;
}
return dp[n-1];
}
};
网友评论