1

解题思路

学习了 @Wilson79题解(本文和他思路基本一致,但他的实现是 O(n))

一句话代码(附在最后)不好理解,写成多行的:

class Solution:
    def cuttingRope(self, n: int) -> int:
        if n < 4:
            return n - 1
        if n % 3 == 0:   # 都剪成 3
            return 3 ** (n//3)  
        if n % 3 == 1:   # 剪一个 4,剩下的都剪成 3 (或者剪两个 2,剩下的都剪成 3)
            return 3 ** ((n-4)//3) * 4
        if n % 3 == 2:   # 剪一个 2,剩下的都剪成 3
            return 3 ** ((n-2)//3) * 2

至于为什么这样,Wilson79 的题解已经给出了详细的解释,为什么 3 最好,我再重复一下归纳以后的策略:

剪出长度 1 是不划算的,尽量不要出现 1,实际上只有 n = 2, n = 3 的时候会剪出 1。其余时候一律不剪 1。

然后策略就是优先剪 3, 但是如果剩下的是 4,就不剪了(因为剩下 4 再剪 3,会剩下 1,还不如不剪),如果剩下 2 也没法剪。

代码

class Solution:
    def cuttingRope(self, n: int) -> int:
        return n-1 if n < 4 else [3**(n//3) , 3**((n-4)//3)*4, 3**(n//3)*2][n%3]

欢迎来我的博客: https://codeplot.top/
我的博客刷题分类:https://codeplot.top/categories/%E5%88%B7%E9%A2%98/


sxwxs
292 声望21 粉丝

计算机专业学生