问题描述
An ugly number is a positive integer whose prime factors are limited to
2
,3
, and5
.Given an integer
n
, return thenth
*ugly number*.
解释:
一个丑数是一个正整数,其公因子只有2,3,5。给定数字n,求第n个丑数
案例:
Input: n = 10
Output: 12
Explanation: [1, 2, 3, 4, 5, 6, 8, 9, 10, 12] is the sequence of the first 10 ugly numbers.
解析:第一个丑数是1,第二个丑数是2,以此类推
Input: n = 1
Output: 1
Explanation: 1 has no prime factors, therefore all of its prime factors are limited to 2, 3, and 5.
解释: 第一个丑数是1
基本思想
这个跟换零钱一样类似,几个数字的组合。构造数组dp, 第n个丑数一定是n之前的丑数 × 2 ,× 3, × 5得到的。所以维持i,j,k三个指针, 使得 dp[n]一定是在 dp[i] * 2, dp[j] * 3, dp[k] * 5 这三个数中取最小的。即 dp[n]取决于dp[i],dp[j],dp[k]。
综上:
- dp[n] = min(dp[i] * 2, dp[j] * 3, dp[k] * 5)
- 其中dp[i]的更新规则如下:如果dp[i]*2 <= dp[n],则 i++
时间复杂度\(O(n^2)\)
代码
C++
int nthUglyNumber(int n) {
if (n<=1) return 1;
int i,j,k;
i=0;
j=0;
k=0;
vector<int> dp(n,0);
dp[0] = 1;
for(int t=1;t<n;++t) {
dp[t] = min(min(dp[i]*2,dp[j]*3), dp[k]*5);
if (dp[i]*2 <= dp[t]) ++i;
if (dp[j]*3<= dp[t]) ++j;
if (dp[k]*5<=dp[t]) ++k;
}
return dp[n-1];
}
python
def nthUglyNumber(self, n: int) -> int:
if n<=0: return 0
i=j=k = 0
dp = [0] * n
dp[0] = 1
for e in range(1,n):
dp[e] = min(min(dp[i]*2, dp[j]*3), dp[k]*5);
if dp[i]*2 <= dp[e]: i = i + 1 # i++ 和 i = i+1 是不一样的
if dp[j]*3 <= dp[e]: j = j + 1
if dp[k]*5 <= dp[e]: k = k + 1
return dp[n-1]
标签:丑数,factors,int,number,II,ugly,dp
From: https://www.cnblogs.com/douniwanli/p/18194588