Ugly Number

解题思路的几个关键:

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];
        
    }
};

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

posted on 2016-05-28 12:09  summerkiki  阅读(166)  评论(0编辑  收藏  举报