剑指 Offer 14- I. 剪绳子
链接:https://leetcode-cn.com/problems/jian-sheng-zi-lcof/
用算法几何不等式,m个数字和是一定的情况下,要想使得乘积是最大的,这m个数字肯定是相等的,然后考虑相等的时候利用求导得出最小值(https://leetcode-cn.com/problems/jian-sheng-zi-lcof/solution/mian-shi-ti-14-i-jian-sheng-zi-tan-xin-si-xiang-by/),可以知道最优剪绳长度为3,这个时候分三种情况:
1.n%3 == 0,最大乘积为3**(n//3)
2.n % 3 == 1, 因为3*1 < 2*2 所以应该将分出一个3加上余出来的1剪成两个长度为2的:3**(n//3-1)*4
3.n%3 == 2,最大乘积为:3**(n//3)*2
时间复杂度:O(1), 求余和幂运算都是O(1),
Python 中常见有三种幂计算函数(https://leetcode-cn.com/problems/jian-sheng-zi-lcof/solution/mian-shi-ti-14-i-jian-sheng-zi-tan-xin-si-xiang-by/): * 和 pow() 的时间复杂度均为 O(\log a)O(loga) ;而 math.pow() 始终调用 C 库的 pow() 函数,其执行浮点取幂,时间复杂度为 O(1)
空间复杂度:O(1)
class Solution:
def cuttingRope(self, n: int) -> int:
import math
if n <= 3:
return (n-1)
if n%3 == 0:
return int(math.pow(3, n//3))
elif n%3 == 1:
return int(math.pow(3, (n//3)-1) * 4)
else:
return int(math.pow(3, (n//3)) * 2)