劍指 Offer 14 I 剪繩子(數學推導)

2021-10-17 12:18:21 字數 887 閱讀 8183

1. 問題描述:

給你一根長度為 n 的繩子,請把繩子剪成整數長度的 m 段(m、n都是整數,n>1並且m>1),每段繩子的長度記為 k[0],k[1]...k[m-1] 。請問 k[0]*k[1]*...*k[m-1] 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2、3、3的三段,此時得到的最大乘積是18。

示例 1:

輸入: 2

輸出: 1

解釋: 2 = 1 + 1, 1 × 1 = 1

示例 2:

輸入: 10

輸出: 36

解釋: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36

2. 思路分析:

一開始的時候沒有啥思路,看了力扣的精選題解之後發現真的是秒啊,可以使用數學推導或者是貪心的思路解決,其實分析題目可以發現題目中存在著乙個明顯的數學關係所以使用數學推導的思路去解決也不難理解,其中力扣中的精選題解對於數學推導的思路講的是很清楚的,主要是求導得到乘積的最大值,**

3. **如下:

class solution:

def integerbreak(self, n: int) -> int:

if n <= 3: return n - 1

a, b = n // 3, n % 3

if b == 0: return int(math.pow(3, a))

if b == 1: return int(math.pow(3, a - 1) * 4)

return int(math.pow(3, a) * 2)

劍指 Offer 14 I 剪繩子

問題 給你一根長度為 n 的繩子,請把繩子剪成整數長度的 m 段 m n都是整數,n 1並且m 1 每段繩子的長度記為 k 0 k 1 k m 1 請問 k 0 k 1 k m 1 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此時得到的最大乘積是18。示例...

劍指 Offer 14 I 剪繩子

劍指 offer 14 i.剪繩子 給你一根長度為 n 的繩子,請把繩子剪成整數長度的 m 段 m n都是整數,n 1並且m 1 每段繩子的長度記為 k 0 k 1 k m 1 請問 k 0 k 1 k m 1 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,...

劍指 Offer 14 I 剪繩子

一 數學推導法 經過一系列推導發現每一段長度為3時,乘積最大。時間複雜度 o 1 空間複雜度 o 1 class solution 二 貪心演算法本質上和數學推導相同,當剩餘長度大於5時每段都切成3,當切到4時,4的最優解是2 2即不切n小於4 返回n 1 n等於4 返回4 n大於4時 繼續切割成長...