丑数专题汇总

CSDN话题挑战赛第2期
参赛话题:算法题解

丑数专题

   四道 丑数题目 千万不要被迷惑哦!

263. 丑数

题目链接:263. 丑数
题目大意:丑数 就是包含质因数 2、3 和 5 的正整数。
给你一个整数 n ,请你判断 n 是否为 丑数 。如果是,返回 true ;否则,返回 false

例如:

输入:n = 6
输出:true
解释:6 = 2 × 3

输入:n = 14
输出:false
解释:14 不是丑数,因为它包含了另外一个质因数 7

解题思路: 循环 求余 整除

class Solution:
    def isUgly(self, n: int) -> bool:
        if n<1: return False
        factor = [2,3,5]
        for i in factor:
            # Be sober!
            while n % i == 0:
                n //= i 
        if n == 1: return True
        return False

264. 丑数 II

题目链接:264. 丑数 II
题目大意:给你一个整数 n ,请你找出并返回第 n 个 丑数 。丑数 就是包含质因数 2、3 和/或 5 的正整数

例如:

输入:n = 10
输出:12
解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。

输入:n = 1
输出:1
解释:1 通常被视为丑数。

解题思路: 动态规划 三个指针。

class Solution:
    def nthUglyNumber(self, n: int) -> int:
        if n<7: return n 
        dp = [1]
        p2 = p3 = p5 = 0
        for i in range(2,n+1):
            newNum = min(dp[p2]*2,dp[p3]*3,dp[p5]*5)
            dp.append(newNum)
            if newNum == dp[p2]*2: p2 += 1
            if newNum == dp[p3]*3: p3 += 1
            if newNum == dp[p5]*5: p5 += 1
        return dp[-1]       

1201. 丑数 III

题目链接:1201. 丑数 III
题目大意:给你四个整数:n 、a 、b 、c ,请你设计一个算法来找出第 n 个丑数。
丑数是可以被 a b c 整除的 正整数 。

例如:

输入:n = 3, a = 2, b = 3, c = 5
输出:4
解释:丑数序列为 2, 3, 4, 5, 6, 8, 9, 10... 其中第 3 个是 4。

输入:n = 5, a = 2, b = 11, c = 13
输出:10
解释:丑数序列为 2, 4, 6, 8, 10, 11, 12, 13... 其中第 5 个是 10

解题思路: 二分法做题 不要被迷惑哦!

class Solution:
    def nthUglyNumber(self, n: int, a: int, b: int, c: int) -> int:

        # 真 tm 坑啊! 二分法
        # 2 or 3 or 5
        # ab = lcm(a,b)
        ab,ac,bc = lcm(a,b),lcm(a,c),lcm(b,c)
        abc = lcm(ab,c)
        def check(k: int) -> bool:
            return k//a+k//b+k//c-(k//ab+k//ac+k//bc)+k//abc < n 
        L,R = 1,2*10**9
        while L < R:
            mid = L + (R-L)//2
            if check(mid):
                L = mid+1 
            else:
                R = mid
        return L  

总结

   丑数这类型的题目 提供有趣,在此记录一下,便于后续复习。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值