Leetcode313 超級醜數

2021-09-02 05:07:42 字數 1582 閱讀 1985

編寫一段程式來查詢第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] 。
解題思路:

多指標法。

假設素數的個數是nums,那麼就分配nums個指標,它們的屬性是primes[i],使得每個指標對應它們指向第k個素數。初始時刻所有指標都指向1,第0個素數。

下乙個醜數必然是這nums個指標指向的數分別乘以它們的屬性,然後在nums個數字中取最小值min。

這些指標中,所有計算結果等於min的都必須向後移動乙個單位,否則下一次計算就會小於當前得到的醜數。

由此可見等待計算的數字不可能超過nums個,因此複雜度為o(n*nums)。

c++**標準版

class solution {

public:

int nthsuperuglynumber(int n, vector& primes) {

int size = primes.size(), i, j;

vectorsgn(size, 0);

vectorret(1, 1);

for (i = 1; i < n; i++) {

int minval = int_max;

vectormove;

for (j = 1; j <= size; j++) {

int newdata = ret[sgn[j - 1]] * primes[j - 1];

if (newdata == minval) move.push_back(j);

else if(newdata

c++**優化版

class solution {

public:

int nthsuperuglynumber(int n, vector& primes) {

if (n == 1) return 1;

int l = primes.size();

vectorugly(n,int_max);

vectortmp(l,1);

vectorcount(l,0);

int next = 1; for (int i = 0; i < n; i++) {

ugly[i] = next;

next = int_max;

for (int j = 0; j < l; j++) {

if (tmp[j] == ugly[i]) {

tmp[j] = ugly[count[j]]*primes[j]; count[j]++;

next = min(next,tmp[j]);

return ugly[n-1];

Leetcode 313 超級醜數

編寫一段程式來查詢第 n個超級醜數。超級醜數是指其所有質因數都是長度為 k的質數列表 primes 中的正整數。示例 輸入 n 12,primes 2,7,13,19 輸出 32 解釋 給定長度為 4 的質數列表 primes 2,7,13,19 前12 個超級醜數序列為 1,2,4,7,8,13,...

leetcode313 超級醜數

編寫一段程式來查詢第 n 個超級醜數。超級醜數是指其所有質因數都是長度為 k 的質數列表 primes 中的正整數。示例 輸入 n 12,primes 2,7,13,19 輸出 32 解釋 給定長度為 4 的質數列表 primes 2,7,13,19 前 12 個超級醜數序列為 1,2,4,7,8,...

leetcode 313 超級醜數

編寫一段程式來查詢第 n 個超級醜數。超級醜數是指其所有質因數都是長度為 k 的質數列表 primes 中的正整數。示例 輸入 n 12,primes 2,7,13,19 輸出 32 解釋 給定長度為 4 的質數列表 primes 2,7,13,19 前 12 個超級醜數序列為 1,2,4,7,8,...