丑数

题目来源

题目描述

描述:

​ 编写一个程序,找出第 n 个丑数。

​ 丑数就是只包含质因数 2, 3, 5 的正整数。

例如:15是3*5,9是3*3,15和9都是丑数

示例:

​ 输入: n = 10
​ 输出: 12
解释:

​ 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。
说明:

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

解法分析

  • 题目要求:第k个丑数。所以我们需要求丑数的升序序列的获取方式。

首先,分析丑数的获取方式

  • 由第一个丑数1,分别于三个质因数相乘,得到三个丑数,然后排序,得到1、2、3、5.
  • 然后对第二个丑数2,再次进行一步骤的操作,得到丑数4、6、10.升序排列得到1、2、3、4、5、6、10.
  • 再对第三个丑数进行一步骤的操作,再对整体的数列进行排序,即可得到新的丑数序列。
  • 丑数既然可以通过这种方式获得,针对题目要求,可以进行一些修改,即可得到第k个丑数。

实现方式思路如下,这里举个例子

  • 对于第一个质因数,分别和2、3、5相乘,取到最小的2,作为第二个质因数,然后,由于1已经和质因数2相乘得到丑数,这时,1不需要和质因数2再做乘法操作来获取丑数
  • 所以,第二次操作,就是1和3、5相乘,而质因数2和第二个丑数相乘,取到最小的3作为第三个丑数,然后,由于1已经和质因数3相乘得到丑数,这时,1不需要和质因数3再做乘法操作来获取丑数
  • 所以,第三次操作,就是1和5相乘,而质因数2、3和第二个丑数相乘,取到最小的4作为第四个丑数,然后,由于2已经和质因数2相乘得到丑数,这时,2不需要和质因数2再做乘法操作来获取丑数
  • 依次类推,即可依次得到丑数序列。

图解

丑数.png

算法实现

  • 由于需要分别标记质因数2、3、5分别和第几个丑数进行乘法运算,所以,可以定义三个指针对应三个质因数,指向数组中的位置。
  • 这样,每次判断出,取到的值是和某个质因数反应,就可以将该质因数对应的指针向后移动一位。

代码实现(Java)

public int nthUglyNumber(int n) {
        //定义一个数组存储丑数序列
        int[] dp = new int[n];
        dp[0] = 1;
        int min = Integer.MAX_VALUE;
        //定义三个指针,分别对应质因数2、3、5.
        int i2 = 0,i3 = 0,i5 = 0;
        for (int i = 1; i < n; i++) {
            //取得最小值作为下一个丑数
            min = Math.min(dp[i2] * 2,Math.min(dp[i5] * 5,dp[i3] * 3));
            //判断是那一个质因数参与得到丑数,将其指针向后移动一位
            if(min == dp[i3] * 3) i3++;
            if(min == dp[i5] * 5) i5++;
            if(min == dp[i2] * 2) i2++;
            //将丑数存入丑数序列
            dp[i] = min;
        }
        return dp[n - 1];
    }
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • [TOC] 一、题目描述 编写一个程序,找出第 n 个丑数。 丑数就是只包含质因数 2, 3, 5 的正整数。 示...
    RuriApoka阅读 2,241评论 0 0
  • 题目: 编写一段程序来查找第 n 个超级丑数。超级丑数是指其所有质因数都是长度为 k 的质数列表 primes 中...
    小橙子哥哥阅读 4,071评论 0 1
  • 题目描述 编写一个程序,找出第 n 个丑数。 丑数就是只包含质因数 2, 3, 5 的正整数。 示例 1: 输入:...
    zhipingChen阅读 1,603评论 0 1
  • 一、题目 编写一段程序来查找第 n 个超级丑数。 超级丑数是指其所有质因数都是长度为 k 的质数列表 primes...
    小怪兽大作战阅读 4,386评论 0 0
  • 题目描述 把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包...
    夜心_d5bb阅读 3,276评论 0 0

友情链接更多精彩内容