剑指 Offer 49. 丑数
题目链接:剑指 Offer 49. 丑数
方法:动态规划
解题思路
代码
class Solution {
public:
int nthUglyNumber(int n) {
int a = 0, b = 0, c = 0;
int dp[n];
dp[0] = 1;
/*
对于当前的丑数,可以由之前的丑数乘上2,3,5得到新的丑数dp[a] * 2, dp[b] * 3, dp[c] * 5,
但是为了保证得到的丑数序列从小到大,只选择其中的最小值(dp[i] * x)作为当前的丑数,然后将对
应的指针i++移向下一个需要乘以x的丑数
*/
for (int i = 1; i < n; i ++ ) {
int n2 = dp[a] * 2, n3 = dp[b] * 3, n5 = dp[c] * 5;
dp[i] = min(min(n2, n3), n5);
if (dp[i] == n2) a ++ ;
if (dp[i] == n3) b ++ ;
if (dp[i] == n5) c ++ ;
}
return dp[n - 1];
}
};
复杂度分析
时间复杂度:\(O(n)\);
空间复杂度:\(O(1)\)。

浙公网安备 33010602011771号