leetcode oj java 313. Super Ugly Number

一、问题描述


Write a program to find the nth super ugly number.

Super ugly numbers are positive numbers whose all prime factors are in the given prime list primes of size k. For example, [1, 2, 4, 7, 8, 13, 14, 16, 19, 26, 28, 32] is the sequence of the first 12 super ugly numbers given primes = [2, 7, 13, 19] of size 4.

Note:
(1) 1 is a super ugly number for any given primes.
(2) The given numbers in primes are in ascending order.
(3) 0 < k ≤ 100, 0 < n ≤ 106, 0 < primes[i] < 1000.



二、解决思路:

参考 http://blog.csdn.net/u011060119/article/details/53968867   思路相同。只是此时ugly number 变为输入的而且长度未知,因此用数组来存放对应的M和I.


三、代码:

package T01;

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

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int n = 12;
        int[] primes = { 1 };
        System.out.println(nthSuperUglyNumber(n, primes));
    }

    public static int nthSuperUglyNumber(int n, int[] primes) {
        int[] re = new int[n];
        if (n == 1) {
            return 1;
        }
        re[0] = 1;
        int np = primes.length;
        int[] M = new int[np];
        int[] I = new int[np];
        for (int i = 1; i < n; i++) {

            // gen M 
            for (int k = 0; k < np; k++) {

                for (int j = I[k]; j < i; j++) {
                    if (primes[k] * re[j] > re[i - 1]) {
                        M[k] = primes[k] * re[j];
                        I[k] = j;
                        break;
                    }
                }
            }
            int min = M[0];
            if (np > 1) {
                for (int j = 1; j < np; j++) {
                    min = min < M[j] ? min : M[j];
                }
            }
            re[i] = min;

        }
        return re[n - 1];
    }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值