Ugly Number II

本文介绍了一种生成第n个丑陋数的算法实现。丑陋数是指只包含质因数2、3和5的正整数。通过维护三个列表来跟踪丑陋数乘以2、3、5的结果,并始终选择最小值加入到结果序列中。

参考:点击打开链接

根据提示中的信息,我们知道丑陋数序列可以拆分为下面3个子列表:

(1) 1×2, 2×2, 3×2, 4×2, 5×2, …
(2) 1×3, 2×3, 3×3, 4×3, 5×3, …
(3) 1×5, 2×5, 3×5, 4×5, 5×5, …

仔细观察上述三个列表,我们可以发现每个子列表都是一个丑陋数分别乘以2,3,5,而要求的丑陋数就是从已经生成的序列中取出来的,我们每次都从三个列表中取出当前最小的那个加入序列

注意下面的错误,不能用else if

会出现m2 == m3 == min的情况,

i2 = 3, i3 = 2, 而list中有1,2,3,4,即相等

public class Solution {
    public int nthUglyNumber(int n) {
        List<Integer> res = new LinkedList<>();
        res.add(1);
        int i2 = 0, i3 = 0, i5 = 0;
        while (res.size() < n) {
            int m2 = res.get(i2)*2;
            int m3 = res.get(i3)*3;
            int m5 = res.get(i5)*5;
            int min = Math.min(m2, Math.min(m3, m5));
            if (m2 == min) {
                i2++;
            }  
            if (m3 == min) {
                i3++;
            } 
            if (m5 == min) {
                i5++;
            }
            // if (m2 == min) {
            //     i2++;
            // } else if (m3 == min) {
            //     i3++;
            // } else if (m5 == min) {
            //     i5++;
            // }
            res.add(min);
        }
        return res.get(res.size() - 1);
    }
}


在计算机科学中,丑数是一个非常有趣的算法问题,它能够帮助我们练习和理解动态规划和最小堆等概念。推荐你阅读《剑指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、付费专栏及课程。

余额充值