Leetcode 313. Super Ugly Number
313. Super Ugly Number
- Total Accepted: 18129
- Total Submissions: 51091
- Difficulty: Medium
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.
思路:
具体方法类似于中的解法,只是primes的规模变成了k。这里做了一些代码书写的优化。
代码:
没有书写优化的方法:
1 class Solution { 2 public: 3 int nthSuperUglyNumber(int n, vector<int>& primes) { 4 int k=primes.size(); 5 vector<int> size(k,0); 6 vector<int> ugly(1,1); 7 int i; 8 while(ugly.size()<n){ 9 int minnum=INT_MAX; 10 for(i=0;i<k;i++){ 11 minnum=min(minnum,ugly[size[i]]*primes[i]); 12 } 13 ugly.push_back(minnum); 14 for(i=0;i<k;i++){ 15 if(minnum==ugly[size[i]]*primes[i]){ 16 size[i]++; 17 } 18 } 19 } 20 return ugly[n-1]; 21 } 22 };
书写优化以后:
1 class Solution { 2 public: 3 int nthSuperUglyNumber(int n, vector<int>& primes) { 4 int k=primes.size(); 5 vector<int> size(k,0); 6 vector<int> ugly(n,INT_MAX); 7 ugly[0]=1; 8 for(int i=1;i<n;i++){ 9 for(int j=0;j<k;j++) ugly[i]=min(ugly[i],ugly[size[j]]*primes[j]); 10 for(int j=0;j<k;j++) size[j]+=ugly[i]==ugly[size[j]]*primes[j]; 11 } 12 return ugly[n-1]; 13 } 14 };
其实可以少1个for循环:
注意到上面都是先计算出ugly[i],然后再找满足ugly[size[j]]*primes[j]的第j个质数引导的列,这样就会多出一个for循环。其实可以先存储每个质数引导的列将要得到的ugly[size[j]]*primes[j],将这个数存储在val[j]中,然后只要取当前最小的val[j],就是下一个ugly[i]。
1 class Solution { 2 public: 3 int nthSuperUglyNumber(int n, vector<int>& primes) { 4 int k=primes.size(); 5 vector<int> ugly(n,INT_MAX); 6 vector<int> id(k,0); 7 vector<int> val(k,1);//放的是j个质数列中未来的第一个数 8 int next=1; 9 for(int i=0;i<n;i++){ 10 ugly[i]=next; 11 next=INT_MAX; 12 for(int j=0;j<k;j++){ 13 if(val[j]==ugly[i]) val[j]=ugly[id[j]++]*primes[j]; 14 next=min(next,val[j]); 15 } 16 } 17 return ugly[n-1]; 18 } 19 };