• 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 }
  • 相关阅读:
    【Codevs 2630】宝库通道
    【Codevs 2115】数集分割
    【HDU2037】今年暑假不AC
    【Codeforces】Round #376 (Div. 2)
    【Dairy】2016.10.17-1 OIer最悲剧的事情
    【Codevs 3115】高精度练习之减法
    【Codevs1080】质数环
    【T^T 1871】获取敌情
    【Codevs3151】交通管制I
    【Codeforces】716D Complete The Graph
  • 原文地址:https://www.cnblogs.com/liujinhong/p/6023797.html
Copyright © 2020-2023  润新知