Leetcode #313: 超级丑数

Leetcode #313: 超级丑数

题目

题干

该问题超级丑数 题面:

A super ugly number is a positive integer whose prime factors are in the array primes. Given an integer n and an array of integers primes, return the nth super ugly number. The nth super ugly number is guaranteed to fit in a 32-bit signed integer.

编写一段程序来查找第 n 个超级丑数。

注: 超级丑数是指其所有质因数都是长度为 k 的质数列表 primes 中的正整数。

示例

输入: n = 12, primes = [2,7,13,19]
输出: 32
解释: 给定长度为 4 的质数列表 primes = [2,7,13,19],前 12 个超级丑数序列为:[1,2,4,7,8,13,14,16,19,26,28,32]

题解

查找超级丑数述

Python

import sys
MAX_INT=sys.maxsize

class Solution:
    def __init__(self, n: int, primes: list) -> None:
        self.n = n
        self.primes = primes

    def nthSuperUglyNumber(self):
        k = len(self.primes)
        idx = [1] * k
        dp = [MAX_INT] * (self.n+1)
        dp[1] = 1
        for i in range(2, self.n+1):
            for j in range(k):
                if dp[idx[j]] * self.primes[j] < dp[i]:
                    dp[i] = dp[idx[j]] * self.primes[j]
            for j in range(k):
                if dp[i] == dp[idx[j]] * self.primes[j]:
                    idx[j] = idx[j] + 1
        return dp[n]

C++

using namespace std;
#include <iostream>
#include <vector>
#include <limits.h>

class Solution {
    
    
public:
    int nthSuperUglyNumber(int n, vector<int>& primes) {
    
    
      int i, j, k = primes.size();
      vector<long> idx(k,1);
      vector<long long> dp(n+1, LONG_LONG_MAX);
      dp[1] = 1;
      for(i = 2; i <= n; ++i)
      {
    
    
        for(j = 0; j < k; ++j)
                if(dp[idx[j]]*primes[j] < dp[i])
                    dp[i] = dp[idx[j]]*primes[j];
        for(j = 0; j < k; ++j)
          if(dp[i] == dp[idx[j]]*primes[j])
            idx[j]++;
    }
    return dp[n];
    }
};

int main(){
    
    
  int n = 12;
  vector<int> primes = {
    
    2,7,13,19};
  Solution s;
  int r = s.nthSuperUglyNumber(n, primes);
  cout << r << endl;
}

Guess you like

Origin blog.csdn.net/wq_0708/article/details/120250817