leetcode oj java 264. Ugly Number II

一、问题描述:

Write a program to find the n-th ugly number.

Ugly numbers are positive numbers whose prime factors only include 2, 3, 5. For example, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 is the sequence of the first 10 ugly numbers.

Note that 1 is typically treated as an ugly number.


二、解决思路:

用数组依次保存ugly number .初始化 ug[0] = 1, ug[1] = 2

       在生成ug[k] 的时候 用M2 记录k之前所有元素乘2之后第一个超过ug[k-1] 的数, 用M3 记录k之前所有元素乘3之后第一个超过ug[k-1] 的数,用M5记录k之前所有元素乘5之后第一个超过ug[k-1] 的数. M2 M3 M5中的最小值即为ug[k].


三、代码:

package T01;

/**
 * @author 作者 : xcy
 * @version 创建时间:2017年1月1日 下午10:02:34
 *          类说明
 */
public class t263 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int num = 9;
        System.out.println(nthUglyNumber(num));
    }

    public static int nthUglyNumber(int n) {
        int[] re = new int[n];
        if (n == 1) {
            return 1;
        }
        if (n == 2) {
            return 2;
        }
        re[0] = 1;
        re[1] = 2;
        int M2 = 0, M3 = 0, M5 = 0;
        int i2 = 0, i3 = 0, i5 = 0;
        for (int i = 2; i < n; i++) {
            // GEN m2
            for (int j = i2; j < i; j++) {
                if (2 * re[j] > re[i - 1]) {
                    M2 = 2 * re[j];
                    i2 = j;
                    break;
                }
            }

            // GEN m3
            for (int j = i3; j < i; j++) {
                if (3 * re[j] > re[i - 1]) {
                    M3 = 3 * re[j];
                    i3 = j;
                    break;
                }
            }

            // GEN m2
            for (int j = i5; j < i; j++) {
                if (5 * re[j] > re[i - 1]) {
                    M5 = 5 * re[j];
                    i5 = j;
                    break;
                }
            }

            int min = M2 < M3 ? M2 : M3;
            min = min < M5 ? min : M5;
            re[i] = min;

        }
        return re[n - 1];
    }
}
Tips:  


在生成M2 的时候,不需要从头开始,只需要从上一个生成M2的位置开始即可。因此用I2记录上一次生成M2的位置。M3,M5同理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值