剑指Offer——(33)丑数

来源:互联网 发布:汉仪综艺简体 mac版本 编辑:程序博客网 时间:2024/09/21 11:22

题目描述:

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

实现如下:

//不用每一个数字都进行判断//而将丑数进行有序的排列,存储到set中//根据定义,丑数乘以2或3或5后,还是丑数//所以初始化第一个丑数1//由三种倍数关系计算出第一个大于当前最大丑数的丑数//将此丑数插入//这三个因数由三个迭代器表示,为第一个乘以倍数后大于当前最大丑数的丑数//这样可以减少重复计算比较小的丑数class Solution {public:    int minNumber(int num1, int num2, int num3)//判断哪一个丑数最小    {        int min = num1 < num2 ? num1 : num2;        return min < num3 ? min : num3;    }    int GetUglyNumber_Solution(int index)     {        if (index <= 0) return 0;//防御性动作        set<int> se;        se.insert(1);//初始化第一个丑数1        //三个迭代器表示不同倍数关系的        set<int>::iterator it2 = se.begin();        set<int>::iterator it3 = se.begin();        set<int>::iterator it5 = se.begin();        set<int>::iterator itTmp;        while (index > se.size())//判断是否为第index个丑数        {            //计算出当前最大丑数的下一个丑数            int min = minNumber(*it2 * 2, *it3 * 3, *it5 * 5);            se.insert(min);//插入min            itTmp = --se.end();            //将三个迭代器更新到相应位置            while (*it2 * 2 <= *itTmp)                ++it2;            while (*it3 * 3 <= *itTmp)                ++it3;            while (*it5 * 5 <= *itTmp)                ++it5;        }        return *(--se.end());//返回第index个丑数的值    }};
原创粉丝点击