313. 超级丑数

题目链接:313. 超级丑数 - 力扣(LeetCode)

 

 

 

 

 

 

 

 

 

 

 

 

 

解析:

一个超级丑数肯定是由小于该数的超级丑数 * prime得来,如果不是这样就有别的因数了

针对每个prime维护一个下标,初始指向第一个超级丑数,也就是1,遍历所有prime * 1 取最小值min_v,min_v就是第二个超级丑数

将所有等于min_v的 乘积,下标++

class Solution {
public:
    int nthSuperUglyNumber(int n, vector<int>& primes) {
        
        int m = primes.size();
        vector<long> array(n, 0);
        vector<long> vis(m + 1, 0);
        array[0] = 1;
        for (int i = 1; i < n; i++) {
            long min_v = array[vis[0]] * primes[0];
            for (int j = 1; j < m; j++) {
                // if (vis[j] < i)
                min_v = min(min_v, array[vis[j]] * primes[j]);
            }
            for (int j = 0; j < m; j++) {
                if (array[vis[j]] * primes[j] == min_v) vis[j]++;
            }
            array[i] = min_v;
        }

        return array[n - 1];
        
    }
};

 

posted @ 2026-01-16 22:58  WTSRUVF  阅读(0)  评论(0)    收藏  举报