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 };
  • 相关阅读:
    [django]django models最佳实战
    [vue]模拟移动端三级路由: router-link位置体现router的灵活性
    [js]顶部导航和内容区布局
    [django]django查询最佳实战
    [vue]webpack使用样式
    [vue]webpack中使用组件
    [vue]组件的导入
    [django]django权限简单实验
    [django]前后端分离之JWT用户认证
    [django]drf知识点梳理-权限
  • 原文地址:https://www.cnblogs.com/Liok3187/p/5016076.html
Copyright © 2011-2022 走看看