九月、丑数,丑的颠覆我的思想,我还是那个少年

@Author:Runsen

@Date:2020/9/28

取一粒跳跃的文字,镶进九月的诗篇,无论是水榭的一角,还是月下的花园,只要有岁月的空格,就能拼接出精美的图案。

纯数学家哈代说,美是检验数学的第一标准,丑数学尾巴长不了。(Beauty is the first test: there is no permanent place in the world for ugly mathematics.)

我说的丑是丑数,不要以为我很丑,而且我也觉得我很丑。

什么是丑数

我们把只包含因子2,3,5的数称作丑数,求按从小到大的顺序,第1500个丑数。习惯上把1当作第一个丑数。

Talk is cheap ,show me my code !

Leetcode 263:判断给定的数是否为丑数

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

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

此题是简单题:一个思路是递归,一个思路就是直接暴力。

第一步:只要num大于5(2,3,5中5最大)就继续循环。
第二步:只要num不能整除其中三个数任意一个,就返回False。
第三步:继续除以可以整除的循环。
备注:这里需要注意的是题目中“1”是返回True。

# 递归的做法
class Solution:
    def isUgly(self, num: int) -> bool:
        if num <= 0: 
            return False
        elif num <=6 : 
            return True
        if num % 2 == 0:
            return self.isUgly(num / 2)
        if num % 3 == 0:
            return self.isUgly(num / 3)
        if num % 5 == 0:
            return self.isUgly(num / 5)
        return False


# while循环暴力破解
class Solution:
    def isUgly(self, num: int) -> bool:
        if num <= 0:
            return False
        while num >= 5:
            if num % 2 != 0 and num % 3 != 0 and num % 5 != 0:
                return False
            else:
                if num % 2 == 0:
                    num = num // 2
                elif num % 3 == 0:
                    num = num // 3
                else:
                    num = num //5
        return True


Leetcode 264:找出第 n 个丑数

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

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

示例:

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

此题是一个我想不到的dp。想一想丑数肯定是一个来源2,3,5 其中一个倍数,然后就是每次选出最小的丑数并添加到数组中。并将该丑数对应的因子指针往前走一步。重复该步骤直到计算完 。对应的dp状态转移方程:min(res[i2] * 2, res[i3] * 3, res[i5] * 5)

class Solution:
    def nthUglyNumber(self, n: int) -> int:
        # 
        # res = [1]*(n)
        # minheap = [2,3,5]
        # for i in range(1,n):
        #     minheap = sorted(set(minheap))
        #     res[i] = minheap.pop(0)
        #     minheap.append(res[i]*2)
        #     minheap.append(res[i]*3)
        #     minheap.append(res[i]*5)
        # return res[-1]
        
        res = [1]
        # 三指针
        i2 = i3 = i5 = 0
        for _ in range(1,n):
            ugly = min(res[i2] * 2, res[i3] * 3, res[i5] * 5)
            res.append(ugly)
            if ugly == res[i2] * 2: 
                i2 +=1
            if ugly == res[i3] * 3: 
                i3 +=1
            if ugly == res[i5] * 5: 
                i5 +=1
        return res[-1]

还要一个最小堆的解决方法,我对heapq 还是不怎么熟悉。

Leetcode 313:超级丑数

示例:

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

方法和上面三指针的dp完全一样。我们在寻找新的超级丑数的时候,只需要寻找M,并选择M数组中最小的一个数来作为这个新的超级丑数就好了。

其实没什么难度,算法的小逻辑做了一些调整,但是算法的思路并没有改变。

class Solution:
    def nthSuperUglyNumber(self, n: int, primes: List[int]) -> int:
        nums = [0 for _ in range(len(primes))]
        result = [1]
        for i in range(1,n):
            ugly = min(result[nums[j]] * primes[j] for j in range(len(nums)))
            result.append(ugly)
            for k in range(len(nums)):
                if ugly == result[nums[k]] * primes[k]:
                    nums[k] +=1
        return result[-1]

后言(今天的日记)

今天Keep打卡!

你在满是泥泞的小路上胆战心惊地跨出了第一步,污泥染黑了你的鞋带,你一只脚深陷在坑里险些拔不出来。你吃力地又跨出了一步,一步又一步,摇摇晃晃又坚定无比。

作为一个跑者,我还不会绑鞋带,今天重重摔了一跤,我“无缘无故”的摔了一跤。看似无缘无故,实则惊心动魄,再一次体会到每一次的安全事故都真的不是无缘无故。

小时候,我不小心摔了一跤,二个膝盖流了鲜红的血。那时,我哇哇的哭了起来,回到家急急忙忙的涂药水。现在又看到了我的血,好像看到了魔鬼在咬我!但是今天没有哭,反而觉得自己该死!活该没有绑好鞋带。写今天总结时,我现在口唇都是出血的。

现在受伤没有人关心、这段经历对我现在感受到了孤独和寂寞。

今天跑步的时候看见了两个农民工,看他们的样子真的很心疼很辛苦。

人只要活在这个世界上,就不免被这个世界所触碰,我想把这些感触都写下来。不管好与坏,平淡或激烈,快乐或痛苦,都是我独一无二的人生。

人生的路,一步都不能少,你有多努力多拼命,心里最清楚。如果你还不能体会,那也没有关系,生活会让你在无数次跌倒中明白,你所有或潦草或努力走过的路,其实都有迹可循。

还好,时光尚早。努力,总有出路。我还是那个少年!

刘润森! CSDN认证博客专家 Python Java 前端
17年就读于东莞XX学院化学工程与工艺专业,GitChat作者。Runsen的微信公众号是"Python之王",因为Python入了IT的坑,从此不能自拔。公众号内容涉及Python,Java计算机、杂谈。干货与情怀同在。关注后回复「小白」即可免费获取原创的Python学习资料;喜欢的微信搜索:「Python之王」。个人微信号:RunsenLiu
©️2020 CSDN 皮肤主题: 猿与汪的秘密 设计师:上身试试 返回首页
实付 19.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值