【剑指offer】面试题34:丑数

题目:

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

思路:

第一个丑数是1,此后保存3个下标:乘以2的数位置、乘以3的数位置、乘以5的数位置。每次比较由2、3、5衍生出来的丑数的大小,取最小的作为下一个丑数。

维护这3个下标:判断下一个丑数是由2、3还是5衍生的,那个数的下标位置前进1.

需要注意的是,下一个丑数可能是其中两个或三个数衍生的,比如在生成6时,2衍生的是6,3在那个时候衍生的恰好也是6.这样,2和3的下标都要移动1,否则下一个又生成了一遍6.

代码:

class Solution {
public:
    int GetUglyNumber_Solution(int index) {
        if(index<=0)  return 0;
        
        int ugly[index];
        int cur=0;
        ugly[cur++]=1;
        int index2=0;
        int index3=0;
        int index5=0;
        for(;cur<index;cur++)
        {
            ugly[cur]=min(ugly[index2]*2,ugly[index3]*3,ugly[index5]*5);
            
            if(ugly[cur]==ugly[index2]*2) index2++;
            if(ugly[cur]==ugly[index3]*3) index3++;//这里不能用else if,因为可能存在2、3、5衍生的数相等且最小
            if(ugly[cur]==ugly[index5]*5) index5++;
        }
        return ugly[index-1];
    }
private:
    int min(int x, int y, int z)
    {
        int res=x<y?x:y;
        res=res<z?res:z;
        return res;
    }
};

 

posted @ 2015-08-13 15:15  不系之舟530  阅读(170)  评论(0编辑  收藏  举报