劍指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 乘法計算,除了一以外,越多的數相...