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

Ugly Number

时间:2016-05-28 12:55:07      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:

技术分享

解题思路的几个关键:

1. 丑数应该是另一个丑数乘以2、3或者5的结果(1默认为丑数)

2. 要确保丑数是排好序的,因此可以考虑把已有的每个丑数乘以2、3和5,选择其中大于当前最大丑数M的最小值,作为下一个丑数

3. 由于数组中的丑数是按序排放,对于乘以2而言,肯定存在某一个丑数T2,排在它之前的每一个数乘以2都小于M,排在它后面的每一个乘以2都大于M。因此,只需要记录下这个位置,同时每次生成新的丑数时,更新这个位置即可。乘以3与5同理。

class Solution {
public:
    int min(int x2, int x3, int x5)
    {
        int num = (x2<=x3)?x2:x3;
        num = (num<=x5)?num:x5;
        
        return num;
    }
    
    int nthUglyNumber(int n) {
        if(n<=0)
            return 0;
        int *uglynumber=new int[n];
        uglynumber[0]=1;
        int count=1;
        int *p2=uglynumber;
        int *p3=uglynumber;
        int *p5=uglynumber;
        
        while(count<n)
        {
            uglynumber[count]=min((*p2)*2,(*p3)*3,(*p5)*5);
            while((*p2)*2<=uglynumber[count])
                p2++;
            while((*p3)*3<=uglynumber[count])
                p3++;
            while((*p5)*5<=uglynumber[count])
                p5++;
            ++count;
        }
        return uglynumber[count-1];
        
    }
};

一定要注意数组边界的变化!!

Ugly Number

标签:

原文地址:http://www.cnblogs.com/summerkiki/p/5537136.html

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