丑数--剑指offer(JAVA)

题目:
我们把只包含因子2, 3,5的数称作丑数。求从小到大的顺序的第1500个丑数。
思路:
第一种思路就是挨个遍历,查看每个数是不是丑数,当找到第1500个丑数时返回。
还有另一种思路,仅仅对丑数进行处理。我们从题目可知,每个丑数都是由其他丑数乘以2,3,5获得的。这样我们把求得的丑数都保存下来,用之前的丑数分别乘以2,3,5,找出这三这种最小的并且大于当前最大丑数的值,即为下一个我们要求的丑数。

public class Solution {
    public static void main(String[] args) {
        int index = 1500;
        int UglyNumofIndex = getUglyNum(index);
        System.out.println(UglyNumofIndex);
    }
    public static int getUglyNum(int index){
        if(index <= 0)
            return 0;
        if(index == 1)
            return 2;
        if (index==2)
            return 3;
        if (index==3)
            return 5;
        int t2 = 1, t3 = 0, t5 = 0;
        int [] res = new int[index];
        res[0] = 2;
        res[1] = 3;
        res[2] = 5;
        int max = 5;

        for(int i = 3; i<index; i++){
            res[i] = Math.min(res[t2]*2, Math.min(res[t3]*3, res[t5]*5));
            if(res[i] == res[t2]*2) t2++;
            if(res[i] == res[t3]*3) t3++;
            if(res[i] == res[t5]*5) t5++;
        }
        return res[index-1];
    }
}

注意代码中的t2,t3和t5。三个值表示当前哪个值乘以对应的倍数能够大于当前的最大丑数。如开头,最大值为res[2]==5,那么乘以2大于5的丑数序号至少为1,res[1]==3×2>5.同理乘以3大于5的是res[0]==2×3>5,乘以5大于5的是res[0]==2×5>5.
每当选中一个t值,证明新的最大值等于当前序号对应值乘以倍数,因此更新序号,也就是+1.

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值