剑指offer—丑数

华电北风吹
天津大学认知计算与应用重点实验室
日期:2015/10/5

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

解析
简单的思路是设置三个队列,分别用来保存因子2,3,5生成的丑数,这样逻辑简单,但是会遇到很多问题,并且效率特别低。比较巧妙的方法是就用一个数组来保存找到过的丑数,不过,我分别用三个int指示上一次因子2,3,5所在指向的位置。

class Solution
{
public:
    int nthUglyNumber(int n) {
        vector <int> results(1, 1);
        int i = 0, j = 0, k = 0;
        while (results.size() < n)
        {
            results.push_back(min(results[i] * 2, min(results[j] * 3, results[k] * 5)));
            if (results.back() == results[i] * 2) ++i;
            if (results.back() == results[j] * 3) ++j;
            if (results.back() == results[k] * 5) ++k;
        }
        return results.back();
    }
};

你可能感兴趣的:(#,剑指offer)