剑指offer(18)-丑数

来源:互联网 发布:ipsec提供网络层之上 编辑:程序博客网 时间:2024/06/01 16:11

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

直观的想法:从1开始一个个判断数字是否为丑数,遇见丑数就记录下来,直到找到低N个为止,不过这样计算复杂度太大。

class Solution {public:    int GetUglyNumber_Solution(int index) {        if (index <= 0)            return 0;        int count = 0;        int UglyNum = 1;        while (count < index)            {            if (isUglyNumber(UglyNum)){                count++;            }            UglyNum++;        }        return UglyNum;    }    bool isUglyNumber(int number)        {        while (number % 2 == 0)            number /= 2;        while (number % 3 == 0)            number /= 3;        while (number % 5 == 0)            number /= 5;        return number == 1 ? 1 : 0;    }};

书中介绍了一种较为高效的解法:
既然要求的丑数最简因子为2,3,5的倍数,先将基数1分别乘以2,3,5,从中找出最小的数,这个数就是下一个丑数。用pMultiply2,pMultiply3和pMultiply5三个指针分别指向小于这个丑数除以2,3,5后的数,不断循环,直到找到满足N的值为止。详细的分析过程可阅读相关章节。

class Solution {public:    int GetUglyNumber_Solution(int index) {        if (index <= 0)            return 0;        int *pUglyNumbers = new int[index];        pUglyNumbers[0] = 1;        int nextUglyIndex = 1;        int *pMultiply2 = pUglyNumbers;        int *pMultiply3 = pUglyNumbers;        int *pMultiply5 = pUglyNumbers;        while (nextUglyIndex < index)            {            int min = Min(*pMultiply2 * 2,*pMultiply3 * 3,*pMultiply5 * 5);            pUglyNumbers[nextUglyIndex] = min;            while (*pMultiply2 * 2 <= pUglyNumbers[nextUglyIndex])                ++pMultiply2;            while (*pMultiply3 * 3 <= pUglyNumbers[nextUglyIndex])                ++pMultiply3;            while (*pMultiply5 * 5 <= pUglyNumbers[nextUglyIndex])                ++pMultiply5;            ++nextUglyIndex;        }         int ugly = pUglyNumbers[nextUglyIndex - 1];         delete [] pUglyNumbers;        return ugly;    }    int Min(int number1,int number2,int number3)        {        int min = number1 < number2 ? number1 : number2;        return min < number3 ? min : number3;    }};
1 0
原创粉丝点击