劍指 Offer 14 I 剪繩子

2022-06-11 18:42:12 字數 1317 閱讀 3139

從題目中可以看出,有最優子結構,可以聯想到動態規劃,其遞迴樹如下:

可以看出,具有很多重疊子問題。

1

/*記憶化搜尋***/2

class

solution

10int breakinteger(int

n) 21 memo[n] =res;

22return

memo[n];

2324}25

public:26

int integerbreak(int

n) 30

};31

32/*

動態規劃**

*/33

class

solution

4041

public:42

int integerbreak(int

n) 52}53

return

memo[n];54}

55 };

記憶化搜尋:

時間複雜度:o(n2),因為breakinteger遞迴函式中有乙個n次迴圈,每個memo[i]的值只會被計算一次,不會重複遞迴計算相同的memo[i] (因為相同的直接返回了),所以時間複雜度為o(n2)

空間複雜度:o(n)

動態規劃:

時間複雜度:o(n2)

空間複雜度:o(n)

以下證明來自:《劍指offer(第2版)》,面試題14- i. 剪繩子(數學推導 / 貪心思想,清晰**)

更詳細的數學證明見:力扣官方題解 - 整數拆分

力扣官方題解 - 整數拆分

c++ dp和貪心 -z

面試題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的三段,此時得到的最大乘積是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時 繼續切割成長...