264 丑数 II
Tag: Math
Heap
Danymic Programming
分析
方法:动态规划,三指针
根据提示我们知道,每一个丑数都可以由它前面的某个丑数乘以2,3,5得到
我们需要一个数组nums来存放丑数,三个指针p2,p3,p5
在 nums[p2] * 2
,nums[p3] * 3
和 nums[p5] * 5
选出最小的数字添加到数组 nums 中,并将该数字对应的因子指针(有可能是多个)向前移动一步。
举例说明:
开始数组中只有1,1乘2,3,5中选择最小的2加入到数组中,即下一个丑数。然后将p2加1,即下一次将是2*2,1*3,与1*5中选择最小的值加入数组中。
理解:
三指针:因为要获取连续的丑数,所以每次都要在三个数中取最小的,而指针的移动就表示该数已经获取过它大下一个丑数。
题解:
public int nthUglyNumber(int n) {
int[] nums = new int[n];
nums[0] = 1;
int p2 = 0, p3 = 0, p5 = 0;
for (int i=1; i<n; i++) {
int ugly = Math.min(Math.min(nums[p2]*2, nums[p3]*3), nums[p5]*5);
nums[i] = ugly;
if (nums[p2]*2==ugly) {
p2++;
}
if (nums[p3]*3==ugly) {
p3++;
}
if (nums[p5]*5==ugly) {
p5++;
}
}
return nums[n-1];
}