LeetCode[313]超级丑数

难度:中等

题目:

超级丑数 是一个正整数,并满足其所有质因数都出现在质数数组 primes 中。
给你一个整数 n 和一个整数数组 primes ,返回第 n 超级丑数
题目数据保证第 n 超级丑数32-bit 带符号整数范围内。

示例 1:

输入:n = 12, primes = [2,7,13,19]输出:32

解释:给定长度为 4 的质数数组 primes = [2,7,13,19],前 12 个超级丑数序列为:[1,2,4,7,8,13,14,16,19,26,28,32] 。


示例 2:

输入:n = 1, primes = [2,3,5]

输出:1

解释:1 不含质因数,因此它的所有质因数都在质数数组 primes = [2,3,5] 中。


提示:

  • 1 <= n <= 105

  • 1 <= primes.length <= 100

  • 2 <= primes[i] <= 1000

  • 题目数据 保证 primes[i] 是一个质数

  • primes 中的所有值都 互不相同 ,且按 递增顺序 排列


Related Topics

  • 数组

  • 数学

  • 动态规划


重点!!!解题思路

可先看前面讲过的LeetCode[264]丑数II,看看有没有灵感

再看看LeetCode[17.09]第k个数,都是相似题

第一步:

首先明确解题手段
我们之前的丑数题的质因子都是给定的,所以我们可以用堆来添加每轮的丑数
但是这道超级丑数题并没有给定质因子,我们并不知道一共几个质因子
所以我们这道题并不能使用堆来解决,只能用老办法数组来试试。

第二步:

我们也是在给定质因子中找出每轮的最小丑数
找到每轮的最小丑数之后,将它添加到集合中去,
添加到集合中去后进行下一轮判断,直到找到第n个位置为止。

讲解+源码:

class Solution {
    public int nthSuperUglyNumber(int n, int[] primes) {
        int[] p=new int[primes.length];//记录质因子出现的次数,出现一次就让p[i]++
        List<Long> data=new ArrayList<>();//丑数序列集合
        data.add(1L);//第一个丑数为1
        long ans=1L;
        while (data.size()!=n){
            ans=primes[0]*data.get(p[0]);//拿到本轮的预计最小丑数
            for (int i=1;i<primes.length;i++){//第一个质因子被用了,所以下标从1开始
                ans=Math.min(ans,primes[i]* data.get(p[i]));//拿到本轮的丑数
            }
            for (int i=0;i<primes.length;i++){//这个循环增加每次循环丑数的下标,避免重复
                if (primes[i]*data.get(p[i])==ans) p[i]++;
            }
            data.add(ans);//添加每轮出现的丑数
        }
        return (int) ans;
    }
}

运行结果:

如果您还有什么疑问或解答有问题,可在下方评论,我会及时回复。

系列持续更新中,点个订阅吧

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月亮被咬碎成星星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值