剑指offer 62. 丑数-java

AcWing 62. 丑数

多路归并

原题链接

我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。

例如 6、8 都是丑数,但 14 不是,因为它包含质因子 7。

求第 n 个丑数的值。

数据范围
1≤n≤1000

代码案例:输入:5
输出:5

注意:习惯上我们把 1 当做第一个丑数

题解

三指针的思想,所以定义3个指针i, j, k。
vector存储的是丑数数组,一开始只有1个1,后面 动态添加元素进vector。
t取出的是3个指针分别指向的3个子数组(2 3 5)中的最小值。如果最小值是3个子数组中的哪一个,就把里面的指针i j k 增1。因为可能同时出现在多个数组,所以用3个if来表示。
最后输出vector的最后一位,就是第n个丑数。
或者可以这样理解:
我们已经明确了 一个非1的丑数 如果能够除以2 3 或者5 就能得到一个比它小的丑数,比如 6可以除以3 得到2,6除以2得到3. 30可以得到 2 3 5 6 15 10等丑数

所有的丑数 都可以从比他大的某个丑数通过这种方式计算得到,也就达到了不重不漏中的不漏。

我们剩下的问题就是避免不重复而有序的生成这些丑数

这里设置三个队列 专门有序存放当前答案集合中存放的丑数的2 3 5的倍数

每次从三个队列中取出最小的数放入答案集合,并且将这个数乘以2 3 5放入相应的队列

那么答案集合中的丑数是有序的,三个队列中的丑数也是有序的

class Solution {
    public int getUglyNumber(int n) {
        int i = 0 , j=0 , k=0;
        ArrayList<Integer> a = new ArrayList<>();
        a.add(1);
        while(--n > 0){
            int t = Math.min(Math.min(a.get(i)*2,a.get(j)*3), a.get(k)*5);
             a.add(t);
             if(a.get(i)*2 == t) i++;
             if(a.get(j)*3== t) j++;
             if(a.get(k)*5 == t) k++;
        }
         int b = a.size()-1;
        return a.get(b);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

依嘫_吃代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值