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

在这里插入图片描述
本质上就是将超级丑数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];
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值