解题思路
学习了 @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/
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。