丑数 II

思路

  • 我们可以首先写出前几个丑数作为种子,比如 array = [1, 2, 3, 4, 5],这是前5个丑数,我们如何确定第6个呢? 第六个丑数,一定是 value2=min(array[i]2),value3=min(array[i]3),value5=min(array[i]5)
    最小的一个,我们可以找到这个数。同时记住取得 value2,value3,value5 时候的位置i分别为 temp2,temp3,temp5 ,下一次在这个基础上继续往下找。

代码


public int nthUglyNumber(int n) {
        List<Integer> list = new LinkedList<Integer>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);

        int temp2 = 1;
        int value2 = 0;
        int temp3 = 1; 
        int value3 = 0;
        int temp5 = 1; 
        int value5 = 0;
        if (n > list.size()) {
            while (list.size() != n) {
                for (; temp2 < list.size(); temp2++) {
                    value2 = list.get(temp2) * 2; 
                    if (value2 > list.get(list.size() - 1)) {
                        break;
                    }
                }

                for (; temp3 < list.size(); temp3++) {
                    value3 = list.get(temp3) * 3; 
                    if (value3 > list.get(list.size() - 1)) {
                        break;
                    }
                }

                for (; temp5 < list.size(); temp5++) {
                    value5 = list.get(temp5) * 5; 
                    if (value5 > list.get(list.size() - 1)) {
                        break;
                    }
                }

                list.add(minist(value2,value3,value5));
            }
        }
        return list.get(n-1);
    }

    public int minist(int a, int b, int c) { //这个求最小值的方法我也是醉了
        if (a - b <= 0&& a - c <= 0) {
            return a;
        }else if (b - a <= 0 && b - c <= 0) {
            return b;
        }else{
            return c;
        }
    }
public int minist2 (int a, int b, int c) {
    int min = a;
    if (min > b) {
         min = b;
    }
    if (min > c) {
        min = c;
    }
    return min;
}

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值