LeetCode-313. Super Ugly Number (JAVA)超级丑数

来源:互联网 发布:wp login.php 编辑:程序博客网 时间:2024/06/05 19:06

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 listprimes 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 givenprimes = [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.
(4) The nth super ugly number is guaranteed to fit in a 32-bit signed integer.

与丑数不同的是,之前求丑数是从2,3,5中找,而本题是给定的质数,求出他们的倍数的超级丑数

质数集合可以任意给定,由于我们不知道质数的个数,我们可以用一个idx数组来保存当前的位置,然后我们从每个子链中取出一个数,找出其中最小值,然后更新idx数组对应位置,注意有可能最小值不止一个,要更新所有最小值的位置

参考:

 LeetCode-263.264. Ugly Number  (JAVA)丑数

public int nthSuperUglyNumber(int n, int[] primes) {int[] dp = new int[n];// 第一个超级丑数是1dp[0] = 1;int[] idxPrimes = new int[primes.length];int counter = 1;while (counter < n) {int min = Integer.MAX_VALUE;for (int i = 0; i < primes.length; i++) {// idxPrimes[i]代表每个丑数的个数,// 比如丑数2题目的2,3,5,// idxPrimes[0]代表2的下标// idxPrimes[1]代表3的下标// idxPrimes[2]代表5的下标int temp = dp[idxPrimes[i]] * primes[i];min = min < temp ? min : temp;}// 如果min和 dp[idxPrimes[i]] * primes[i]相等,// 则其对应的下标++for (int i = 0; i < primes.length; i++) {if (min == dp[idxPrimes[i]] * primes[i]) {idxPrimes[i]++;}}dp[counter] = min;counter++;}return dp[n - 1];}


0 0
原创粉丝点击