超级丑数(巧用记忆数组)
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 - 输入有序数组