LeetCode 246 & 313 丑数

问题

找到第n个超级丑数。超级丑数是正数,且它的所有质因数都在给定的质数列表中。
246是313的特殊情况,即指定质因子的个数和值。第一个丑数是1。

输入: n = 12, primes = [2,7,13,19]
输出: 32 
解释: [1,2,4,7,8,13,14,16,19,26,28,32] 是给定大小为4的质数数组 [2,7,13,19]的前12个丑数序列.

解析

一种最直观的解法是,暴力枚举:不管三七二十一,首先丑数列表是[1],然后每个质数都乘上丑数列表里面的数,得到[1,2,3,5];然后再乘一次得到[1,2,3,5,4,6,10,6,9,15,10,15,25],这样会得到重复的而且没有顺序的结果,所有需要去重后排序,这样复杂度太高…
我们换个思路考虑,假设三个质数是2,3,5,那么第二个丑数一定是 n u m [ 1 ] = M i n ( 1 ∗ 2 , 1 ∗ 3 , 1 ∗ 5 ) num[1]=Min(1*2,1*3,1*5) num[1]=Min(12,13,15),第三个丑数是 n u m [ 2 ] = M i n ( 2 ∗ 2 , 1 ∗ 3 , 1 ∗ 5 ) num[2] = Min(2*2,1*3,1*5) num[2]=Min(22,13,15),第四个丑数是 M i n ( 2 ∗ 2 , 2 ∗ 3 , 1 ∗ 5 ) Min(2*2,2*3,1*5) Min(22,23,15)

因此,我们只需要记录2,3,5分别乘到第几个丑数位置了。
313超级丑数是进阶版,更一般的情况,这时候创建一个数组来保存每个质数乘到第几个丑数的位置。

Java代码

    public int nthSuperUglyNumber(int n, int[] primes) {
        int count[] = new int[primes.length];
        int num[] = new int[n];
        num[0]=1;
        int i=1;
        for(;i<n;i++){
            int temp = Integer.MAX_VALUE;
            for(int j=0;j<primes.length;j++){
                temp = Math.min(temp,num[count[j]]*primes[j]);
            }
            num[i] = temp;
            for(int j=0;j<primes.length;j++){
                if(temp==num[count[j]]*primes[j]){
                    count[j]++;
                }
            }
        }
        return num[n-1];
    }

对于246,只需要将primes换成2,3,5可得最终代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值