剑指 Offer 49. 丑数

本文介绍了一种使用动态规划算法高效求解第N个丑数的方法。通过维护三个指针跟踪乘以2、3、5后生成的新丑数,确保每次迭代都能找到下一个最小丑数。

大致思路:动态规划。重点理解xn+1=Min(xa×2,xb×2,xc×2)①x_{n+1} = Min(x_{a}\times2, x_b\times2,x_c\times2) \qquad\qquad\qquad ①xn+1=Min(xa×2,xb×2,xc×2)

其中,{xa×2>xn≥xa−1×2,即xa为首个乘以2后大于xn的丑数xb×3>xn≥xb−1×3,即xa为首个乘以3后大于xn的丑数xb×5>xn≥xc−1×5,即xa为首个乘以5后大于xn的丑数\left \{ \begin {aligned} x_a \times 2 > x_n \geq x_{a-1} \times 2 , 即x_a为首个乘以2后大于x_n的丑数\\ x_b \times 3 > x_n \geq x_{b-1} \times 3 , 即x_a为首个乘以3后大于x_n的丑数\\ x_b \times 5 > x_n \geq x_{c-1} \times 5 , 即x_a为首个乘以5后大于x_n的丑数 \end{aligned} \right. xa×2>xnxa1×2,xa为首个乘以2后大于xn的丑数xb×3>xnxb1×3,xa为首个乘以3后大于xn的丑数xb×5>xnxc1×5,xa为首个乘以5后大于xn的丑数

可以这样理解:每一个丑数乘以2,3,5都会生成一个新的丑数。丑数数组就是由每一个丑数分别乘以2,3,5之后进行排序得来的。而我们通过动态规划来确定各丑数的位置。我们可以设置三个指针a,b,c,a指针表示乘以2的丑数遍历到的位置,b指针表示乘以3的丑数遍历到的位置,c指针表示乘以5的丑数遍历到的位置。根据①可知,每个新生成的丑数都是由这三个指针指向的丑数分别乘以对应的因子后的最小值。然后进行取余,判断出得到的这个丑数是由那个因子得到的。然后对这个因子的索引加一。遍历完n之后,dp[n-1]就是答案。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值