264 ugly number II 丑数
问题描述
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++
时间复杂度
代码
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]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具