超级丑数(巧用记忆数组)

Posted 秦枫-_-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了超级丑数(巧用记忆数组)相关的知识,希望对你有一定的参考价值。


本质上就是将超级丑数ans[]不断跟prime[]中元素相乘得到最新的丑数,那么会出现一个问题:
1.如何保证每次放进ans的丑数都是按照次序放进去的?
2.如何保证每次放进ans的丑数不是重复值?
灵感来源于B站:
链接: 超级丑数.
解题思路:
查找最小丑数可以边历数组,但是不能去重,那么我们通过观察可以考虑到prime[i]跟ans[j]乘过之后就不能回头在用prime[i]*ans[j]了,也就是prime[i]每次在使用完后只用下次乘ans[++j]了,也就是prime[i]最多跟ans[j]乘一次,那么只要用一个数组记录prime[i]使用次数x那么也对应了下一次他应该跟ans[x]相乘,如此每次找出当前最小的超级丑数,放入ans,其次还要在遍历一次去重

class Solution {
    public int nthSuperUglyNumber(int n, int[] primes) {
     int []primenum=new int[primes.length];
     int []ans=new int[n];
     ans[0]=1;
     int idx=1,lastugly=1;
     while(idx<n){
         lastugly=Integer.MAX_VALUE;
         for(int i=0;i<primes.length;i++){
           if(ans[primenum[i]]*primes[i]<lastugly){//查找当前最小丑数
               lastugly=ans[primenum[i]]*primes[i];
           }
         }
         for(int i=0;i<primes.length;i++){//去重,并且把使用次数+1更新下次使用位置
            if(ans[primenum[i]]*primes[i]==lastugly)
            primenum[i]++;
         }
         ans[idx++]=lastugly;
     }
     return ans[n-1];
    }
}

以上是关于超级丑数(巧用记忆数组)的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 313. 超级丑数(最小堆动态规划)/413. 等差数列划分/167. 两数之和 II - 输入有序数组

数据结构与算法之深入解析“超级丑数”的求解思路与算法示例

LeetCode 313 超级丑数[动态规划] HERODING的LeetCode之路

java算法之超级丑数

超级丑数--用查找的api解决

超级丑数--用堆查找解决