一开始用了list稍微有点慢。改用了数组好多了。这里我们是使用三个指针来惰性的计算下一个值,取出其中最小的值加入到数组,注意值可能会有重复,所以我们要对于得到的三个值都进行判断,相等则指针加一。
class Solution {
public int nthUglyNumber(int n) {
if(n==1) return 1;
int[] result = new int[n];
int pos1 =0;
int pos2 =0;
int pos3 =0;
result[0]=1;
for(int i = 1 ;i<n;i++)
{
int val1 = 2*result[pos1];
int val2 =3*result[pos2];
int val3 = 5*result[pos3];
int smaller = val1<val2?val1:val2;
int smallest = smaller<val3?smaller:val3;
if(val1==smallest)
{
result[i]=val1;
pos1++;
}
if(val2==smallest)
{
if(val2>result[i])
result[i]=val2;
pos2++;
}
if(val3==smallest)
{
if(val3>result[i])
result[i]=val3;
pos3++;
}
}
return result[n-1];
}
}```