(Java)丑数

文章目录

    • 一、题目
    • 二、题解

一、题目

把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。

二、题解

已知丑数的因子只有2,3,5,即丑数 p = 2^x * 3^y * 5^z,或者说:丑数一定是由另一个丑数乘以2或者3或者5得到。

此时可以维护三个队列:

1)丑数数组: 1
乘以2的队列:2
乘以3的队列:3
乘以5的队列:5
选择三个队列头最小的数2加入丑数数组,同时将该最小的数乘以2,3,5放入三个队列;
(2)丑数数组:1,2
乘以2的队列:4
乘以3的队列:36
乘以5的队列:510
选择三个队列头最小的数3加入丑数数组,同时将该最小的数乘以2,3,5放入三个队列;
(3)丑数数组:1,2,3
乘以2的队列:4,6
乘以3的队列:6,9
乘以5的队列:5,10,15
选择三个队列头里最小的数4加入丑数数组,同时将该最小的数乘以2,3,5放入三个队列;

不需要维护三个队列,只需要记录三个队列的指针进行到哪一步即可。
(Java)丑数_第1张图片

public int GetUglyNumber_Solution(int index) {
        if (index <= 0) {
            return 0;
        }
        //集合list用来记录存入的丑数
        ArrayList<Integer> list = new ArrayList<>();
        //存入第一个丑数
        list.add(1);
        //分别记录相应队列的下标,起始均为0
        int i2 = 0, i3 = 0, i5 = 0;
        while (list.size() < index) {
            //得到三个乘积中的最小值
            int m2 = list.get(i2) * 2;
            int m3 = list.get(i3) * 3;
            int m5 = list.get(i5) * 5;
            int min = Math.min(m2, Math.min(m3, m5));
            //加入最小值
            list.add(min);
            //相对于的数组下标移进一位
            if (min == m2) {
                i2++;
            }
            if (min == m3) {
                i3++;
            }
            if (min == m5) {
                i5++;
            }
        }
        return list.get(list.size()-1);
    }

你可能感兴趣的:(Java,刷题笔记)