首页 > 其他 > 详细

Ugly Number

时间:2016-05-28 12:55:06      阅读:102      评论: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
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!