***剑指offer-丑数

题目描述,输入一个N,输出第N个丑数。 丑数的意思是质因子是2,3,5的数,规定1是第一个丑数。

思路:既然质因子是2,3,5,  那么一个丑数肯定就只能是2^a*3^b*5^c 的数,a,b,c为指数,丑数乘丑数也依旧是丑数。只要能正确的组合a,b,c,取不同的值,然后可以得到从小到达的丑数,那么题目就容易做出来了。可是怎么才能实现呢。

考虑两个不等式,  对于p,2*p<3*p<5*p,  对于2,不同数p<q,则2*p<2*q。

一开始第一个丑数是1,这时候候选的丑数有 1*2 、1*3、1*5 ,找出他们中最小的,即2,并从候选丑数中剔除2。

此时第二个丑数是2了,这时候候选的丑数有1*3、1*5、2*2、2*3、2*5。若我们不通过上面两个不等式将候选集缩小,则会导致需要比较的数的个数变得非常多,那时间复杂度特别高。此时,观察到1*3<2*3、1*5<2*5所以可以直接剔除后面这两个数。

从而只需要比较2*2 、1*3、1*5了。之后都可以按照这个规则。会发现通过底数或者指数来比较,每次都会剔除到3个数。

java程序:

public class Solution {
    public int GetUglyNumber_Solution(int index) {
        if(index<7)
            return index;
        int[] arr = new int[index];
        arr[0]=1;
        int t1=0,t2=0,t3=0;
        for(int i =1;i<index;i++){
            arr[i]=Math.min(2*arr[t1],Math.min(3*arr[t2],5*arr[t3]));
            if(arr[t1]*2==arr[i])t1++;
            if(arr[t2]*3==arr[i])t2++;
            if(arr[t3]*5==arr[i])t3++;
        }
        return arr[index-1];
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值