【C++刷题】丑数

在LintCode上刷题时遇到了一道比较基础的问题。

丑数:设计一个算法,找出只含素因子2,3,5的第n小的数。

           符合条件的数如:1, 2, 3, 4, 5, 6, 8, 9, 10, 12...

           我们可以认为1也是一个丑数。

           要求时间复杂度为 O(nlogn) 或者 O(n)。

比如输入9,那么输出的应该是第9个丑数,也就是10。

比较直观的思路就是从1开始递增,判断当前数字是否为符合条件的丑数,如果是的话,count就加1,当count等于输入时,输出当前的丑数就是答案。判断一个数是否是丑数并不难,只要将这个数中所有的2,3,5都除净,结果为1就是丑数,不为1就说明这个数有别的因子,就不是丑数。

对应的C++代码如下:

class Solution {

public:

    /**

    * @param n: An integer

    * @return: return a  integer as description.

    */

    int nthUglyNumber(int n) {

        // write your code here

        int i=0;

        int current_num=0;

        int count=0;

        while(count

            i++;

            current_num=i;

            while(current_num%2==0)

                current_num=current_num/2;

            while(current_num%3==0)

                current_num=current_num/3;

            while(current_num%5==0)

                current_num=current_num/5;

            if(current_num==1)

                count++;

        }

        return i;

    }

};

这个方法可以得到正确结果,但是明显不符合时间复杂度为 O(nlogn) 或者 O(n)的要求。实际提交代码的时候也会因为超时而无法通过。

考虑使用动态规划解决这个问题,后续会更新。

你可能感兴趣的:(【C++刷题】丑数)