zoukankan      html  css  js  c++  java
  • 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 

  • 相关阅读:
    SharePoint 2013 配置基于表单的身份认证
    SharePoint 2013 场解决方案包含第三方程序集
    SharePoint 2010 站点附加数据升级到SP2013
    SharePoint 2013 在母版页中插入WebPart
    SharePoint 2013 搭建负载均衡(NLB)
    SharePoint 部署解决方案Feature ID冲突
    SharePoint 2013 配置基于AD的Form认证
    SharePoint Server 2016 Update
    SharePoint 2013 为用户组自定义EventReceiver
    SharePoint 2013 JavaScript API 记录
  • 原文地址:https://www.cnblogs.com/Deribs4/p/5676733.html
Copyright © 2011-2022 走看看