解题思路:
使用三指针
第一个丑数是1
, 之后的丑数都是基于前面的丑数分别乘以2
、3
、5
组成的,
每次将当前三个丑数中最小的一个添加进数组, 这个最小的丑数是由谁计算的, 谁指针就后移一位
注意:
使用的是三个if
不能使用else if
例如丑数为6
的时候, 既可以由3 * 2
得到, 又可以由2 * 3
得到
class Solution {
public int nthUglyNumber(int n) {
int a = 0, b = 0, c = 0;
int[] dp = new int[n];
dp[0] = 1;
for(int i = 1; i < n; i++){
int n1 = dp[a] * 2, n2 = dp[b] * 3, n3 = dp[c] * 5;
dp[i] = Math.min(n1, Math.min(n2, n3));
if(n1 == dp[i]) a++;
if(n2 == dp[i]) b++;
if(n3 == dp[i]) c++;
}
return dp[n - 1];
}
}