264 ugly number II 丑数

问题描述

An ugly number is a positive integer whose prime factors are limited to 2, 3, and 5.

Given an integer n, return the nth *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(n2)

代码

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]
posted @   金字塔下的蜗牛  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示