1. 程式人生 > >LeetCode 264--醜數 II ( Ugly Number II ) ( C語言版 )

LeetCode 264--醜數 II ( Ugly Number II ) ( C語言版 )

題目描述 : 

當我們去遍歷查詢第n個醜數時 , 則會出現超出時間限制 ;

據觀察可知醜數就相當於三個已排序陣列的合集

1*2 2*2 3*2 4*2 5*2 6*2 8*2 .......'

1*3 2*3 3*3 4*3 5*3 6*3 8*3 .......

1*5 2*5 3*5 4*5 5*5 6*5 8*5 .......

當前醜數都是由上一個醜數乘以質因數得到的 , 那麼下一個醜數就應該是上一個醜數乘以質因數的最小值 , 

程式碼如下 : 

int nthUglyNumber(int n) {
    int num[n];
    if(n==1)
        return 1;
    num[0]=1;
    int i=1;
    int p2=0,p3=0,p5=0; 
    for(;i<n;i++){
        //取出醜數乘以質因數後的最小值
        int ret=num[p2]*2<num[p3]*3?num[p2]*2:num[p3]*3;
        ret=ret<num[p5]*5?ret:num[p5]*5;
        if(ret==num[p2]*2)
            p2++;
        if(ret==num[p3]*3)
            p3++;
        if(ret==num[p5]*5)
            p5++;
        num[i]=ret;
    }
    return num[n-1]; 
}