zoukankan      html  css  js  c++  java
  • [LintCode] 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.

    Notice:
    1 is a super ugly number for any given primes.
    The given numbers in primes are in ascending order.
    0 < k ≤ 100, 0 < n ≤ 10^6, 0 < primes[i] < 1000

    Example
    Given n = 6, primes = [2, 7, 13, 19] return 13

    LeetCode上的原题,请参见我之前的博客Super Ugly Number

    解法一:

    class Solution {
    public:
        /**
         * @param n a positive integer
         * @param primes the given prime list
         * @return the nth super ugly number
         */
        int nthSuperUglyNumber(int n, vector<int>& primes) {
            vector<int> res(1, 1), pos(primes.size(), 0);
            while (res.size() < n) {
                vector<int> t;
                for (int i = 0; i < primes.size(); ++i) {
                    t.push_back(res[pos[i]] * primes[i]);
                }
                int mn = INT_MAX;
                for (int i = 0; i < primes.size(); ++i) {
                    mn = min(mn, t[i]);
                }
                for (int i = 0; i < primes.size(); ++i) {
                    if (t[i] == mn) ++pos[i];
                }
                res.push_back(mn);
            }
            return res.back();
        }
    };

    解法二:

    class Solution {
    public:
        /**
         * @param n a positive integer
         * @param primes the given prime list
         * @return the nth super ugly number
         */
        int nthSuperUglyNumber(int n, vector<int>& primes) {
            vector<int> dp(n, 1), pos(primes.size(), 0);
            for (int i = 1; i < n; ++i) {
                dp[i] = INT_MAX;
                for (int j = 0; j < primes.size(); ++j) {
                    dp[i] = min(dp[i], dp[pos[j]] * primes[j]);
                }
                for (int j = 0; j < primes.size(); ++j) {
                    if (dp[i] == dp[pos[j]] * primes[j]) {
                        ++pos[j];
                    }
                }
            }
            return dp.back();
        }
    };
  • 相关阅读:
    STM32中管脚利用
    阻抗匹配
    无功功率与补偿
    宏的灵活应用例子
    串口接入检测与串口命令解析
    16 款最流行的JavaScript 框架
    不可错过的10个超棒jQuery表单操作代码片段
    20 个用于处理页面滚动效果的 jQuery 插件
    11 个最佳 jQuery 滚动条插件
    jQuery的搜索关键词自动匹配插件
  • 原文地址:https://www.cnblogs.com/grandyang/p/5438631.html
Copyright © 2011-2022 走看看