- 要求 :
把只包含因子2,3,5的数称为丑数。输出从小到大排序的第n个丑数。
- 说明:
- 1是丑数,是第一个丑数
- 输入10,输出12,因为有[1,2,3,4,5,6,8,9,10,12]
- 丑数=某个丑数×某个因子
- 丑数按从小到大的顺序排列,所以需要比较大小来决定是哪个丑数乘了某个因子
- 初始时,都指向1,分别比较 *2,*3,*5的大小关系,选择其中一个最小值,选中之后,该因子对应的起始位置就往后移一个。nums[0]变成了nums[1]这样。
- 其实可以理解为将一个数组分为三个部分组成,然后合并三个数组,相同的部分抵消,且按从小到大的顺序排列。
class Solution {
public int nthUglyNumber(int n) {
if (n < 0) return 0;
if (n < 6) return n;
int p1 = 0, p2 = 0, p3 = 0;
int[] nums = new int[n];
nums[0] = 1;
for (int i = 1; i < n; i++) {
nums[i] = Math.min((nums[p1]*2), Math.min(nums[p2]*3, nums[p3]*5));
if (nums[i] == nums[p1]*2) p1++;
if (nums[i] == nums[p2]*3) p2++;
if (nums[i] == nums[p3]*5) p3++;
}
return nums[n-1];
}
}