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++;
        }

  

posted @ 2020-04-07 11:38  ZJPang  阅读(182)  评论(1编辑  收藏  举报