题目连接: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++; }