丑数

该篇博客介绍了一个使用动态规划算法解决编程问题的实例——找到第n个只包含质因子2、3和5的丑数。通过维护三个指针x2、x3和x5,分别对应于2、3和5的乘积,动态更新数组a,存储已找到的丑数。博主展示了代码实现,并指出算法的时间复杂度为O(n),空间复杂度为O(n)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。

示例:

输入: n = 10
输出: 12
解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。
说明:

1 是丑数。
n 不超过1690。

解题思路

动态规划,最新的数字一定是2,3,5的倍数,创建一个数组,里面是之前找到的丑数,只要在他们的基础上,是他们的2,3,5的倍数,一定是符合条件的
时间复杂度O(n)
空间复杂度O(n)

提交结果

在这里插入图片描述

package main

import (
    "fmt"
)

func main() {
    fmt.Println(nthUglyNumber(11))
}
func nthUglyNumber(n int) int {
    a := []int{1}
    x2, x3, x5 := 0, 0, 0
    for i := 1; i < n; i++ {
        a = append(a, min(2*a[x2], 3*a[x3], 5*a[x5]))
        if a[len(a)-1] == int(2*a[x2]) {
            x2++
        }
        if a[len(a)-1] == int(3*a[x3]) {
            x3++
        }
        if a[len(a)-1] == int(5*a[x5]) {
            x5++
        }
    }
    return a[n-1]
}
func min(a, b, c int) int {
    if a < b {
        if a < c {
            return a
        } else {
            return c
        }
    } else {
        if b < c {
            return b
        } else {
            return c
        }
    }
}

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/chou-shu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值