版权声明:未经允许禁止转载 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);
}
}