思路
三个计算通道存放最近算出的三个丑数(可重复),最小的也在其中,f(n+1) = min(2pass1, 3pass2, 5*pass3)。
时间复杂度O(n),空间复杂度O(n)。
代码
public class Solution {
public int GetUglyNumber_Solution(int index) {
if(index < 1) return 0;
int[] num = new int[index];
num[0] = 1;
int a = 0, b = 0, c = 0;
for(int i = 1; i < index; i++) {
num[i] = Math.min(2*num[a], Math.min(3*num[b], 5*num[c]));
if(num[i] == 2*num[a]) a++;
if(num[i] == 3*num[b]) b++;
if(num[i] == 5*num[c]) c++;
}
return num[index-1];
}
}
笔记
三个if判断必须独立,不能写成if-elseif-else形式,否则会出错,因为三个通道可能会出现相等的情况,相等时通道也要更新。