劍指 Offer 14 II 剪繩子 II

2021-10-07 21:20:13 字數 1121 閱讀 6844

題目:

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

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

示例 1:

輸入: 2

輸出: 1

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

示例 2:

輸入: 10

輸出: 36

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

貪心法,三是最優的,先切三,其次切二

class

solution

long res =

1l;int mod =

1000000007

;while

(n >4)

//迴圈完以後,n只有2、3、4三種情況

return

(int

)(res*n%mod);}

}

快速冪求解

public

class

solution

int a = n/3;

int b = n%3;

if(b ==0)

else

if(b ==1)

return

(int

)pow(3

, a)*2

;}private

long

pow(

long base,

int num)

base *= base;

base %= mod;

num = num >>1;

//有符號右移,相當於除於二

}return res;

}public

static

void

main

(string[

] args)

}

劍指 Offer 14 II 剪繩子 II

給你一根長度為 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 II 剪繩子 II

給你一根長度為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。答案需要取模 1e9 ...

劍指offer 14 II 剪繩子 II

此題在剪繩子 的基礎上,多了個取餘,因此不能用 math.pow 方法,需要自己實現求冪。這裡使用快速冪,可以當做模板,時間為o logn 空間為o 1 主要優化點是用右移運算子代替了除以2,用位與運算子代替了求餘來判斷乙個數是奇數還是偶數。注意,為什麼快速冪的指數用 long 型別?因為int範圍...