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 };

 

 

参考:https://discuss.leetcode.com/topic/34841/java-three-methods-23ms-36-ms-58ms-with-heap-performance-explained 

posted @ 2016-07-17 16:12  Deribs4  阅读(208)  评论(0编辑  收藏  举报