每天一道算法题——丑数

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

分析:

使用两个队列一个存放节点,一个存放值。先将根节点加入到队列中,然后遍历队列中的元素,遍历过程中,访问该元素的左右节点,再将左右子节点加入到队列中来

源码:

public class Test1 {
    public class Solution {
        final int d[] = { 2, 3, 5 };
        public int GetUglyNumber_Solution(int index) {
            if(index == 0) return 0;
            int a[] = new int[index];
            a[0] = 1;
            int p[] = new int[] { 0, 0, 0 };
            int num[] = new int[] { 2, 3, 5 };
            int cur = 1;
            while (cur < index) {
                int m = finMin(num[0], num[1], num[2]);
                if (a[cur - 1] < num[m])
                    a[cur++] = num[m];
                p[m] += 1;      
                num[m] = a[p[m]] * d[m];
                }
            return a[index - 1];
            }
        private int finMin(int num2, int num3, int num5) {
            int min = Math.min(num2, Math.min(num3, num5));
            return min == num2 ? 0 : min == num3 ? 1 : 2;}
        }
    }

运行测试:

运行时间:17ms
占用内存:8524k

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值