劍指Offer 剪繩子 和剪繩子

2022-01-12 14:52:48 字數 1382 閱讀 1076

劍指offer:剪繩子ⅰ

題目描述:

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

求的是每段乘積,那麼把1排除,其次再看2,3,5,7…等;

n * 5 < n * 2 * 3; n * 7 < n * 2 * 2 * 3… 可知5和7應該再分成2和3進行乘積;

在進行劃分時,則只存在2和3兩種數字乘積;

劃分最後一段的結果為三種:1,2,3;當為1時無效,則應劃分成2,2;

所以最後一段要麼為乙個2,要麼為兩個2,否則沒有2;

注意:當輸入長度為3或2是,直接返回n-1.

class

solution

int s=1;

//取出乙個2

if(n%3==

2)//取出兩個2

if(n%3==

1)//剩下全部都是3

while

(n >0)

return s;}}

;

解題思路2:

思路同上,只是實現方法不同;

在退出while迴圈時,可能的n為:4,3,2;

不可能為1,因為4-3=1,已經把1為分成2*2=4了。

public

intcuttingrope

(int n)

return sum*n;

}

劍指offer:剪繩子ⅱ

問題描述:

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

答案需要取模 1e9+7(1000000007),如計算初始結果為:1000000008,請返回 1。

解題思路:

與上面的思路一樣,只是最後計算乘積時進行取餘即可;

這裡需要取兩次餘,最後返回值處於臨界點時,乘以乙個大與1的數,則超出1000000007。

class

solution

while

(n >4)

return

(s*n)

%1000000007;}

};

剪繩子 演算法 424,劍指 Offer 剪繩子

給你一根長度為 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 ...

劍指offer 剪繩子

題目 給你一根長度為n繩子,請把繩子剪成m段 m n都是整數,n 1並且m 1 每段的繩子的長度記為k 0 k 1 k m k 0 k 1 k m 可能的最大乘積是多少?例如當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此 時得到最大的乘積18。思路 動態規劃 任何動態規劃都是由遞迴演...

《劍指Offer》剪繩子

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