动态规划丑数二

本文介绍了一个巧妙的动态规划问题——求第N个丑数的算法。通过记录已知丑数并使用三个指针分别乘以2、3、5来生成新的丑数,确保每次选择最小的丑数作为下一个丑数。该算法详细解释了如何更新指针以避免重复计算。
摘要由CSDN通过智能技术生成
class Solution {
    public int nthUglyNumber(int n) {
    	int ans[]=new int[n],count=1,index2=0,index3=0,index5=0;
    	ans[0]=1;
    	while(count<n) {
    		ans[count]=Math.min(2*ans[index2],Math.min(3*ans[index3],5*ans[index5]));
    		if(ans[count]==2*ans[index2])
    			index2++;
    		if(ans[count]==3*ans[index3])
    			index3++;
    		if(ans[count]==5*ans[index5])
    			index5++;
    		count++;
    	}
    	return ans[n-1];
    }
}
/*
@yayawxw
@DP
一个十分巧妙的动态规划问题
    1.我们将前面求得的丑数记录下来,后面的丑数就是前面的丑数*2,*3,*5
    2.但是问题来了,我怎么确定已知前面k-1个丑数,我怎么确定第k个丑数呢
    3.采取用三个指针的方法,index2,index3,index5
    4.index2指向的数字下一次永远*2,index3指向的数字下一次永远*3,index5指向的数字永远*5
    5.我们从2*index2 3*index3 5*index5选取最小的一个数字,作为第k个丑数
    6.如果第K个丑数==2*index2,也就是说前面0-index2个丑数*2不可能产生比第K个丑数更大的丑数了,所以index2++
    7.index3,index5同理
    8.返回第n个丑数
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

canaryW

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值