Description:
Write a program to find the n-th ugly number.
Ugly numbers are positive numbers whose prime factors only include 2, 3, 5. For example, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 is the sequence of the first 10 ugly numbers.
Note that 1 is typically treated as an ugly number, and n does not exceed 1690.
Best Solution:
/*
*跟这道题http://blog.csdn.net/laputafallen/article/details/79197664的思路很相似
*依然是用2,3,5和UglyNumber组合相乘产生新的UglyNumber,举例来说[1, 2, 3, 4, 5, 6, 8, 9, 10, 12]中的2由1 * 2,3由1*3,4由2*2产生,需要注意的是避免重复项。因此我们保留一个dp数组,里面
*维护着第i次得到的UglyNumber,并且我们得到2,3,5与已存在的UglyNumber组合产生的新UglyNumber时
*要更新2,3,5对应的下标(注意代码中的3个if,并不是if-else if-else结构)
*/
class Solution {
public int nthUglyNumber(int n) {
if(n <= 0) return 0;
int[] dp = new int[n];
dp[0] = 1;
int i2 = 0, i3 = 0, i5 = 0;
for(int i = 1; i < n; i++)
{
int n2 = dp[i2] * 2, n3 = dp[i3] * 3, n5 = dp[i5] * 5;
dp[i] = Math.min(n2, Math.min(n3, n5));
//要特别注意这部分
if(dp[i] == n2) i2++;
if(dp[i] == n3) i3++;
if(dp[i] == n5) i5++;
}
return dp[n - 1];
}
}