我的博客

leetcode 剑指 offer 面试题14- I. 剪绳子 - 一行代码

目录
  1. 解题思路
  2. 代码

解题思路

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

发现他的方法是可以写成 O(1) 时间的。

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

1
2
3
4
5
6
7
8
9
10
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 也没法剪。

代码

1
2
3
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]

评论无需登录,可以匿名,欢迎评论!