LeetCode 313. Super Ugly Number

题目

寻找第n个丑数。
首先我们维护一个丑数的数组,所有的丑数必然是前面的某个丑数乘以primes数组里的某个数字得来。

所以我们在维护一个primes数组对应的最小丑数数组下标pos,primes[i]*pos[i] 就是未来的某个丑数,按照从小到大一个一个计算。

class Solution {
public:
    int pos[105];
    int ugly[1000005];
    int nthSuperUglyNumber(int n, vector<int>& primes) {
        
        if(primes.size()==0)
            return 1;
        
        for(int i=0;i<primes.size();i++)
        {
            pos[i]=1;
        }
        
        ugly[1]=1;
        int ans=1;
        for(int i=2;i<=n;i++)
        {
            int m = INT_MAX;
            
            for(int j=0;j<primes.size();j++)
            {
                if(primes[j]==1)
                    continue;
                if(m>primes[j]*ugly[pos[j]])
                {
                    m=primes[j]*ugly[pos[j]];
                }
            }
            
            for(int j=0;j<primes.size();j++)
            {
                if(primes[j]*ugly[pos[j]] == m)
                {
                    pos[j]++;
                }
            }
            
            if(m==INT_MAX)
                m=1;
            ugly[i]=m;
            ans = m;
        }
        
        return ans; 
    }
};
原文地址:https://www.cnblogs.com/dacc123/p/13047626.html