图解LeetCode——剑指 Offer 49. 丑数

简介: 图解LeetCode算法题

一、题目

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

二、示例

2.1> 示例:

输入】 n = 10

输出】 12

解释】 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。

说明:

  • 1 是丑数。
  • n 不超过1690

三、解题思路

根据题意,我们要获取从小到大顺序的第n个丑数,那么对于任意一个丑数,其计算公式就是:2的x次方 * 3的y次方 * 5的z次方(x,y,z分别表示数字2、3、5的出现次数);

针对以上逻辑,我们就针对数字2数字3数字5创建3个指针,分别为:index2index3index5

由于1就是丑数,所以,当我们创建待返回结果数组result之后,就可以直接将第一个元素赋值为1了,即:result[0]=1,然后进行如下计算逻辑:

针对数字2】计算2*index2的值,如果是最小值,则将该值保存到result数组中,并且执行index2++

针对数字3】计算3*index3的值,如果是最小值,则将该值保存到result数组中,并且执行index3++

针对数字5】计算5*index5的值,如果是最小值,则将该值保存到result数组中,并且执行index5++

针对上面的逻辑计算,当满足result的长度等于n的时候,则返回result[n-1]就是这道题所要获得的第n个丑数了。

如上就是本题的解题思路了,下面我们还是依照惯例,通过例子来演示一下。由于篇幅问题,下面我只画出了result中的第4个元素的构造过程,不过对于整体解题思路的理解是没有任何影响的。具体请见下图所示:

四、代码实现

class Solution {
    public int nthUglyNumber(int n) {
        int index2 = 0, index3 = 0, index5 = 0;
        int[] result = new int[n];
        result[0] = 1;
        for(int i = 1; i < n; i++) {
            int minValue = Math.min(Math.min(2 * result[index2], 3 * result[index3]), 5 * result[index5]);
            if (minValue == 2 * result[index2]) index2++;
            if (minValue == 3 * result[index3]) index3++;
            if (minValue == 5 * result[index5]) index5++;
            result[i] = minValue;
        } 
        return result[n - 1];
    }
}

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

相关文章
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
63 6
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 26. 树的子结构
这篇文章提供了解决LeetCode上"剑指Offer 26. 树的子结构"问题的Python代码实现和解析,判断一棵树B是否是另一棵树A的子结构。
56 4
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
56 5
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 30. 包含min函数的栈
本文提供了实现一个包含min函数的栈的Python代码,确保min、push和pop操作的时间复杂度为O(1)。
33 4
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
Leetcode题目"剑指 Offer 21. 调整数组顺序使奇数位于偶数前面"的两种Python解决方案,一种是使用双端队列调整数组顺序,另一种是使用双指针法将奇数移到数组前半部分,偶数移到后半部分。
29 4
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 18. 删除链表的节点
Leetcode题目"剑指 Offer 18. 删除链表的节点"的Python解决方案,通过使用双指针法找到并删除链表中值为特定数值的节点,然后返回更新后的链表头节点。
46 4
|
4月前
|
算法 JavaScript Python
【Leetcode刷题Python】79. 单词搜索和剑指 Offer 12. 矩阵中的路径
Leetcode第79题"单词搜索"的Python解决方案,使用回溯算法在给定的二维字符网格中搜索单词,判断单词是否存在于网格中。
53 4
|
4月前
|
算法 Python
【Leetcode刷题Python】剑指 Offer 33. 二叉搜索树的后序遍历序列
本文提供了一种Python算法,用以判断给定整数数组是否为某二叉搜索树的后序遍历结果,通过识别根节点并递归验证左右子树的值是否满足二叉搜索树的性质。
26 3
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - II. 从上到下打印二叉树 II
本文提供了一种Python实现方法,用于层次遍历二叉树并按层打印结果,每层节点按从左到右的顺序排列,每层打印到一行。
41 3
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - I. 从上到下打印二叉树
本文介绍了使用Python实现从上到下打印二叉树的解决方案,采用层次遍历的方法,利用队列进行节点的访问。
37 2