LeetCode 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.


【题目分析】

在之前ugly number题目的基础上,这个题目在primes数上进行了扩充,不只是之前的2,3,5这三个数,而是可以以一个增序的序列给出k个质数。在这个基础上求出第n个ugly number。


【思路】

与之前的思路相同,我们为每一个prime维持一个指针指向i,表示第i次的ugly number与该prime相乘的结果作为下一个ugly number的候选值。每次我们取这些候选值中最小的,因此每个prime的指针指向的数与该prime相乘都会大于当前最后一个ugly number。当某些指针指向的数与当前prime相乘是最小的话,该prime指针向后移动一位。

一个例子如下:primes = [2,3,5], n = 7

1. 初始第一个ugly number是1,三个指针都指向1.

  比较1*2,1*3,1*5的大小,取最小值,并且对应的指针向后移动,结果如下:

2. 第二个ugly number是2。比较1*3,1*5和2*2的大小取最小值,对应指针向后移动,结果如下:

3. 第三个ugly number是3。比较1*5,2*3和2*2的大小取最小值,对应指针向后移动,结果如下:

4. 第四个ugly number是4。比较1*5,2*3和3*2的大小取最小值,对应指针向后移动,结果如下:

以此类推,结果如下:


【java代码】

 1 public class Solution {
 2     public int nthSuperUglyNumber(int n, int[] primes) {
 3         int[] pointerN = new int[primes.length];
 4         int[] num = new int[n];
 5         num[0] = 1;
 6         
 7         for(int i = 1; i < n; i++) {
 8             int min = Integer.MAX_VALUE;
 9             for(int j = 0; j < primes.length; j++) {
10                 int curnum = primes[j] * num[pointerN[j]];
11                 if(curnum < min) min = curnum;
12             }
13             num[i] = min;
14             for(int j = 0; j < pointerN.length; j++) {
15                 int curnum = primes[j] * num[pointerN[j]];
16                 if(curnum == min) pointerN[j]++;
17             }
18         }
19         return num[n-1];
20     }
21 }
原文地址:https://www.cnblogs.com/liujinhong/p/6023797.html