丑数
题目描述
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。思路
三个计算通道存放最近算出的三个丑数(可重复),最小的也在其中,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形式,否则会出错,因为三个通道可能会出现相等的情况,相等时通道也要更新。
更多精彩