码迷,mamicode.com
首页 > 其他好文 > 详细

【剑指Offer】丑数

时间:2015-10-18 01:16:46      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:算法   牛客网   剑指offer   丑数   

问题描述

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

算法分析

每个位置上的丑数都是某个丑数乘上2或3或5的结果,看如下示例:

第1个丑数是 1,
第2个丑数是 1 * 2 = 2, 第1个丑数*2
第3个丑数是 1 * 3 = 3, 第1个丑数*3
第4个丑数是 2 * 2 = 4, 第2个丑数*2
第5个丑数是 1 * 5 = 5, 第1个丑数*5
第6个丑数是 2 * 3 = 6, 第2个丑数*3
。。。。。
我们以w2,w3,w5分别记录为2、3、5出现的位置,初始都为0,设丑数序列为A
最开始我们也只有丑数1,
第2个丑数为min(A[w2]*2 , A[w3]*3, A[w5]*5),然后最小值为A[w2]*2,所以w2可以向后移一位,这样下一次就是计算第2个丑数乘以2,
从而保证了丑数序列的不断递增,直到找到第index丑数。

class Solution {
public:
    int GetUglyNumber_Solution(int index) {
        if (index == 1) return 1;
        int* x = new int[index];
        x[0] = 1;
        int w2 = 0, w3 = 0, w5 = 0;
        for (int i = 1, j = 1; i < index; i++){
            int tmp2 = x[w2] * 2;
            int tmp3 = x[w3] * 3;
            int tmp5 = x[w5] * 5;
            int t = min(tmp2, min(tmp3, tmp5));
            if (t == tmp2) w2++;
            if (t == tmp3) w3++;
            if (t == tmp5) w5++;
            x[i] = t;
        }
        return x[index - 1];
    }
};

版权声明:本文为博主原创文章,未经博主允许不得转载。

【剑指Offer】丑数

标签:算法   牛客网   剑指offer   丑数   

原文地址:http://blog.csdn.net/zgljl2012/article/details/49209703

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!