丑数

##题目描述 把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。

思路

三个计算通道存放最近算出的三个丑数(可重复),最小的也在其中,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形式,否则会出错,因为三个通道可能会出现相等的情况,相等时通道也要更新。

原文地址:https://www.cnblogs.com/ustca/p/12356703.html