Ugly Number II

ugly number:

一个数的的素因数只有2,3,5,其中1是ugly number。

这道题要求找到第n个ugly number。

思路如下:

第一个是1,

以后的数要求与2,3,5相乘找到其中的最小的值,将其存在数组num中

例如:

l2=l3=l5=0;都对应第一个数num[0]。

n=4, 第一个元素1分别与2,3,5相乘,得到2,3,5,将2存在数组中num[1]=2;l2++,指向num[1];

下次将1与3,5相乘,2与2相乘,得到最小值3,存在数组中num[2]=3,l3++,指向num[1];

一直进行n-1次。


其中在判断是乘哪个得到的最小值,要进行if();if();if()判断而不是if() else if。

这是因为当num有 1,2,3,4,5,6时,l2=2指向3,l3=l5=1指向2。这时num[l2]*2==num[l3]*3,这个需要同时对l2++,l3++。

代码如下:


class Solution{
	public:
		int nthUglyNumber(int n){
			vector<int> num(1,1);
			int m,l2=0,l3=0,l5=0;
			if(n==1) return 1;
			n--;
			cout<<num.back()<<endl;
			while(n){
				m=min(num[l2]*2,min(num[l3]*3,num[l5]*5));
				num.push_back(m);
				cout<<n<<" "<<num.back()<<" "<<l2<<" "<<l3<<" "<<l5<<endl;
				n--;
				if(num[l2]*2==m) l2++;
				if(num[l3]*3==m) l3++;
				if(num[l5]*5==m) l5++;
			}
			return m;
		}
};



在计算机科学中,丑数是一个非常有趣的算法问题,它能够帮助我们练习和理解动态规划和最小堆等概念。推荐你阅读《剑指Offer:丑数(Python)》,这份资料详细讲解了丑数问题的解题思路和Python实现方法,非常适合希望提升算法能力的读者。 参考资源链接:[剑指Offer:丑数(Python)](https://wenku.youkuaiyun.com/doc/64530762fcc539136803da9f?spm=1055.2569.3001.10343) 丑数问题的核心是找出只包含质因子2、3和5的数列,并按照从小到大的顺序输出第N个丑数。我们可以通过动态规划的方法来解决这个问题。动态规划方法的核心在于维护三个指针,分别代表乘以2、乘以3和乘以5时的索引,然后每次取这三个指针指向的值与当前最大丑数相乘的结果中的最小值作为下一个丑数,同时更新对应的索引指针。这种方法避免了重复计算,可以有效地求解出第N个丑数。 下面是一个Python函数的实现示例,它使用了动态规划的方法来找出第N个丑数: ```python def nthUglyNumber(n): if n <= 0: return 0 ugly_numbers = [1] * n index2, index3, index5 = 0, 0, 0 for i in range(1, n): next_ugly = min(ugly_numbers[index2] * 2, ugly_numbers[index3] * 3, ugly_numbers[index5] * 5) ugly_numbers[i] = next_ugly if next_ugly == ugly_numbers[index2] * 2: index2 += 1 if next_ugly == ugly_numbers[index3] * 3: index3 += 1 if next_ugly == ugly_numbers[index5] * 5: index5 += 1 return ugly_numbers[-1] # 使用函数获取第N个丑数 print(nthUglyNumber(10)) ``` 通过上述代码,我们可以找到第N个丑数。在学习过程中,如果遇到更多与动态规划、算法设计和优化相关的问题,建议继续查阅《剑指Offer:丑数(Python)》,这不仅会帮助你巩固当前的知识点,还能拓展你的算法视野,让你在技术学习的道路上更加深入。 参考资源链接:[剑指Offer:丑数(Python)](https://wenku.youkuaiyun.com/doc/64530762fcc539136803da9f?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值