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 

  • 相关阅读:
    python基础33——进程池&线程池/协程
    python基础32——线程
    pycharm2020
    python基础31——进程
    python基础31——操作系统史&多道
    jmeter如何保持JSESSIONID
    Jmeter中自动重定向与跟随重定向的区别
    Jmeter之HTTP Cookie 管理器
    Kubernetes简述
    docker集群部署
  • 原文地址:https://www.cnblogs.com/Deribs4/p/5676733.html
Copyright © 2011-2022 走看看