丑数(剑指offer-33)
题目描述
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
题目解析
动态规划求解,维护一个之前求解的丑数的数组,下一个丑数由之前的某个丑数推导出来
每个下一个丑数,必然是历史丑数乘以2、3、或5得到的
暂取下一个丑数为当前丑数乘以2、3、或5得到的三个数中的最小值
为保证丑数递增,则需要分别维护2、3、5对应的一组历史丑数,小于当前丑数,对应的历史丑数的索引
下一个丑数即为三个数字维护的历史丑数 乘以 自身获取的三个数字中的最小数
题目解答
public class Solution {
public int GetUglyNumber_Solution(int index) {
if(index<=6) return index;
int[] a = new int[index];// 暂存丑数
a[0] = 1;//初始化第一个丑数
int index1 = 0;//遍历丑数*2的队列
int index2 = 0;//遍历丑数*3的队列
int index3 = 0;//遍历丑数*5的队列
for(int i=1;i<index;i++){
a[i] = Math.min(Math.min(a[index1]*2,a[index2]*3),a[index3]*5);
// 根据放在第i个位置上的数字更新遍历三个队列的下标
if(a[i] == a[index1]*2) index1++;
if(a[i] == a[index2]*3) index2++;
if(a[i] == a[index3]*5) index3++;
}
return a[index-1];
}
}
Stay hungry,Stay foolish