链接:https://leetcode-cn.com/problems/ugly-number-ii/
编写一个程序,找出第 n 个丑数。
丑数就是质因数只包含 2, 3, 5 的正整数。
示例:
输入: n = 10
输出: 12
解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。
说明:
1 是丑数。
n 不超过1690。
定义三个指针:i2、i3 和 i5,其作用分别对应着 2、3 和 5 的倍数。丑数的定义是质因数只包含 2, 3, 5 的正整数。所以我们从小开始,将丑数一个一个放进结果数组中,直到要找的个数为止。
定义数组元素的含义
定义 dp[i] 代表第 i 个丑数;
寻找递推表达式
dp[i]=min(dp[i2]*2,dp[i3]*3,dp[i5]*5)
找出初始值
dp[0]=1,因为 1 是丑数。
时间复杂度:O(n)
空间复杂度:O(n)
Python:
class Solution:
def nthUglyNumber(self, n: int) -> int:
dp=[1]
i2=i3=i5=0
for i in range(1,n):
ugly=min(dp[i2]*2,dp[i3]*3,dp[i5]*5)
dp.append(ugly)
if ugly == dp[i2]*2:
i2+=1
if ugly == dp[i3]*3:
i3+=1
if ugly== dp[i5]*5:
i5+=1
return dp[n-1]
Go:
func nthUglyNumber(n int) int {
dp:=make([]int,n)
dp[0]=1
i2,i3,i5:=0,0,0
for i:=1;i<n;i++{
j2,j3,j5:=dp[i2]*2,dp[i3]*3,dp[i5]*5
dp[i]=min(min(j2,j3),j5)
if dp[i]==j2{
i2++
}
if dp[i]==j3{
i3++
}
if dp[i]==j5{
i5++
}
}
return dp[n-1]
}
func min(a,b int) int{
if a<b{
return a
}
return b
}
如果觉得文章不错,希望大家可以点击上方名片关注我噢,点赞、收藏、在看、分享就再好不过了。如果有任何建议和问题,可以在下方给我留言,我会及时回复的,同时会不定期更新更多的文章,祝我们终将自由。