• 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 

  • 相关阅读:
    023.抓到“拔粪青年”
    JQuery给元素动态增删类或特性
    HTML元素的基本特性
    ASP.NET MVC中如何在客户端进行必要的判断
    ASP.NET MVC如何在页面加载完成后ajax异步刷新
    C#如何根据DataTable生成泛型List或者动态类型list
    C#sql语句如何使用占位符
    在html借助元素特性存储信息
    ASP.NET MVC中如何以ajax的方式在View和Action中传递数据
    如何根据集合动态构建复选框选择控件
  • 原文地址:https://www.cnblogs.com/Deribs4/p/5676733.html
Copyright © 2020-2023  润新知