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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值