LeetCode 264

Posted 菜鸡的世界

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 264相关的知识,希望对你有一定的参考价值。

题目连接:https://leetcode-cn.com/problems/ugly-number-ii/solution/

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

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

示例:

输入: n = 10
输出: 12
解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。
说明:  

1 是丑数。
n 不超过1690。
通过次数21,570提交次数42,291

首先先上代码

class Solution {
    public int nthUglyNumber(int n) {
        if(n<7){
            return n;
        }
        int pos2=0,pos3=0,pos5=0;
        int[] array = new int[n];
        array[0] =1;
        for(int i = 1; i < n;i++){
            array[i] = Math.min(array[pos2]*2,Math.min(array[pos3]*3,array[pos5]*5));
            if( array[i] == array[pos2]*2)
                pos2++;
            if( array[i] == array[pos3]*3)
                pos3++;
            if( array[i] == array[pos5]*5)
                pos5++;
        }
        return array[n-1];
    }
}

  一行一行的来分析代码。

首先由示例我们知道,1-6都是所谓的丑数,所以为了加快程序运行,直接进行判断后返回即可。

其次,该方法使用了三指针的思想,让我们来具体分析一下。

由于题目将丑数定义为其质因数只能为2,3,5.那么它肯定是由{2,3,5}这三个数乘于一定的倍数而来的。那我们使用pos2,pos3,pos5来记录这三个质因数的上一轮的位置。

第一轮

array[0] =1;

array[pos2]*2= 2;

array[pos3]*3=3;

array[pos5]*5=5;

因为题目要求我们按照升序的顺序来排列,所以取这三个数中较小的数存入array[1]中。即为2.

第二轮

array[0]=1,array[1]=2;

array[pos2]*2 = 2;

array[pos3]*3=3;

array[pos5]*5=5;

问题出现了,pos2位置的数的2的倍数出现了重复,因为我们在上一轮已经使用过这个数来进行比较了,所以我们应该在上一轮将这个数进行更新。

            if( array[i] == array[pos2]*2)
                pos2++;
            if( array[i] == array[pos3]*3)
                pos3++;
            if( array[i] == array[pos5]*5)
                pos5++;
        }

  

以上是关于LeetCode 264的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode(算法)- 264. 丑数 II

LeetCode 264

leetcode 264. Ugly Number II

LeetCode(264):Ugly Number II

LeetCode 264

LeetCode——264. 丑数 II