丑数(剑指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];
    }
}
posted @ 2020-07-08 08:51  10000_Hours  阅读(105)  评论(0编辑  收藏  举报