计算丑数

版权声明:未经允许禁止转载 https://blog.csdn.net/weixin_38481963/article/details/88379314

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

这里暴力的算法是不行的,只能通过前面的丑数去退出后面的丑数,一直推到N。
问题是如何保证计算出的丑数是有序的呢?
这里的丑数都是由2、3、5、计算得出。于是我们从1开始,逐个计算出最小的丑数,那么一直到最后都是有序的。
怎么计算呢?
首先数组中第一个丑数是1,然后令i1,i2,i3分别为2对应要乘的丑数下标,3要乘的丑数下标和5要乘的丑数下标。初始值都为0,指向丑数1;
这里模拟一下:
首先
num1 = arr[i1] * 2;
num2 = arr[i2] * 3
num3 = arr[i3] * 5;
得出值分别为2,3,5。然后从这些值中选取最小(这里为2)的放入数组中,并且对应的下标i1要指向下一位,因为第一位已经乘过2,所以要指向下一位。
重复上述操作,即可求出所有的有序丑数。

import java.util.*;
public class Solution {
    public int GetUglyNumber_Solution(int index) {
        if(index<1) return 0;
        List<Integer> list = new ArrayList<>(1000);
        list.add(1);
        index--;
        int i1 = 0,i2 = 0, i3 = 0;
        while(index>0){
            int num1 = list.get(i1)*2;
            int num2 = list.get(i2)*3;
            int num3 = list.get(i3)*5;
            int min = Math.min(num1,Math.min(num2,num3));
            list.add(min);
            if(min==num1) i1++;
            if(min==num2) i2++;
            if(min==num3) i3++;
            index--;
        }
        return list.get(list.size()-1);
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_38481963/article/details/88379314