Leetcode之丑数系列

263. 编写一个程序判断给定的数是否为丑数。

丑数就是只包含质因数 2, 3, 5 的正整数

示例 1:

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

示例 2:

输入: 8
输出: true
解释: 8 = 2 × 2 × 2

示例 3:

输入: 14
输出: false 
解释: 14 不是丑数,因为它包含了另外一个质因数7
说明:
  1. 1 是丑数。
  2. 输入不会超过 32 位有符号整数的范围: [−231,  231 − 1]。

tips:根据题意,所谓丑数,即该数的因式分解只能由给定的[2,3,5]组成。那么我们可以将其不断除以2/3/5判断是否为1即可,代码如下。

class Solution:
    def isUgly(self, num: int) -> bool:
        if num<=0:
            return False
        while num%2==0:
            num/=2
        while num%3==0:
            num/=3
        while num%5==0:
            num/=5
        if num==1:
            return True
        return False

 


 264. 编写一个程序,找出第 n 个丑数。

丑数就是只包含质因数 2, 3, 5 的正整数

示例:

输入: n = 10
输出: 12
解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。

tips: 暴力搜索是不可能的,这辈子都不可能的。我们知道,所有的丑数都是由前边的丑数*2 or *3 or *5得到,我们只需判断用哪一个前列的元素作哪一种乘法即可。此处我们引用三个指针,分别代表当前 *2元素的位置,在此之前的*2得到的值都已经入列丑数数组中;以及当前*3 和*5的位置。最后选取三个指针分别相乘的最小值添加至丑数数组中,对应指针+1。注意有可能出现相等的情况,如2*3==3*2,此时需要将指针+1即可。代码如下:

class Solution:
    def nthUglyNumber(self, n: int) -> int:
        res=[1]
        p1=0;p2=0;p3=0
        if n<=0:
            return 
        while n-1:
            mini=min(res[p1]*2,res[p2]*3,res[p3]*5)
            if mini!=res[-1]:
                res.append(mini)
                n-=1
            if res[-1]==res[p1]*2:
                p1+=1
            elif res[-1]==res[p2]*3:
                p2+=1
            else:
                p3+=1
            
        return res[-1]

313. 编写一段程序来查找第 n 个超级丑数。

超级丑数是指其所有质因数都是长度为 k 的质数列表 primes 中的正整数。

示例:

输入: 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] 。

说明:

  • 1 是任何给定 primes 的超级丑数。
  •  给定 primes 中的数字以升序排列。
  • 0 < k ≤ 100, 0 < n ≤ 106, 0 < primes[i] < 1000 。
  • 第 n 个超级丑数确保在 32 位有符整数范围内。

 该程序与第二个思想一致,代码如下:

class Solution:
    def nthSuperUglyNumber(self, n: int, primes: List[int]) -> int:
        lenth=len(primes)
        p=[0 for _ in range(lenth)]
        res=[1]
        while n-1:
            mini=min([res[p[i]]*primes[i] for i in range(lenth)])
            if mini != res[-1]:
                res.append(mini)
                n-=1
            for i in range(lenth):
                if mini == res[p[i]]*primes[i]:
                    p[i]+=1
        return res[-1]

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值