zoukankan      html  css  js  c++  java
  • [LeetCode][Java][JavaScript]Super Ugly Number

    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.

    https://leetcode.com/problems/super-ugly-number/


    Ugly Number II一样的思路。

    动态规划,ugly number肯定是之前的ugly number乘以primes中的其中一个数得到的。

    结果存在dp数组中,每一个dp中的数都要乘以primes中的数,寻找所有的结果,也就是说primes中的每一个数都需要一个变量记录位置。

    举例来说primes : [2, 5, 7]。

    一开始2, 5, 7都指向0的位置。

    每一轮循环都用2, 5, 7与当前位置的数相乘,把最小的放进dp数组中。

    Java:

     1 public static int nthSuperUglyNumber(int n, int[] primes) {
     2     int[] dp = new int[n + 1], prime = new int[primes.length];
     3     int dpIndex = 1, minIndex = -1;
     4     dp[0] = 1;
     5     while(dpIndex <= n){
     6         int min = Integer.MAX_VALUE;
     7         for(int i = 0; i < primes.length; i++){
     8             int tmp = dp[prime[i]] * primes[i];
     9             if(tmp < min){
    10                 min = tmp;
    11                 minIndex = i;
    12             }
    13         }
    14         prime[minIndex]++;
    15         if(min != dp[dpIndex - 1]){
    16             dp[dpIndex] = min;
    17             dpIndex++;
    18         }
    19     }
    20     return dp[n - 1];
    21 }

    JavaScript:

     1 /**
     2  * @param {number} n
     3  * @param {number[]} primes
     4  * @return {number}
     5  */
     6 var nthSuperUglyNumber = function(n, primes) {
     7     var i, dp = [1], prime = [], dpIndex = 1, tmp, min, minIndex;
     8     for(i = 0; i < primes.length; i++) prime[i] = 0;
     9     while(dpIndex <= n){
    10         min = Infinity;
    11         for(i = 0; i < primes.length; i++){
    12             tmp = dp[prime[i]] * primes[i];
    13             if(tmp < min){
    14                 min = tmp;
    15                 minIndex = i;
    16             }
    17         }
    18         prime[minIndex]++;
    19         if(min !== dp[dpIndex - 1]){
    20             dp[dpIndex] = min;
    21             dpIndex++;
    22         }
    23     }
    24     return dp[n - 1];
    25 };
  • 相关阅读:
    JavaScripts广告轮播图以及定时弹出和定时隐藏广告
    JavaScript正则表达
    表单常用标签 和 属性
    html框架集
    Hbuilder 快捷键
    css 图片
    html input accept类型
    db2 sql
    js 数组排序
    html input size maxlength
  • 原文地址:https://www.cnblogs.com/Liok3187/p/5016076.html
Copyright © 2011-2022 走看看