劍指 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+7(1000000007),如計算初始結果為:1000000008,請返回 1。

示例 1:

輸入: 2
輸出: 1
解釋: 2 = 1 + 1, 1 × 1 = 1

示例 2:

輸入: 10
輸出: 36
解釋: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36

提示:

  • 2 <= n <= 1000

貪心演算法:

證明思路:還是借鑑K神吧,真心拜服。

做題思路:

  • 如果n == 2,返回1,如果n==3則返回3
  • 如果n==4,則直接返回4
  • 如果n>4,儘量分成長度為3的小段,每次迴圈長度n減去3,再得到res=res*3。最後返回時乘以小於等於4的最後一段即可。一般在while迴圈,只有n-=3等於n=2 或者3 或者4的時候才會跳出while迴圈。
class Solution {
public int cuttingRope(int n) {
if(n < 4){
return n - 1;
}
long res = 1;
while(n > 4){//優先切三,其次切二
res = res * 3 % 1000000007;
n -= 3;
}
return (int) (res * n % 1000000007);
}
}

以下程式碼是借鑑K神思路寫的程式碼:

class Solution {
public int cuttingRope(int n) {
if(n <= 3)
return n - 1;
int b = n % 3, p = 1000000007;
long ret = 1;
int lineNums=n/3; //線段被我們分成以3為大小的小線段個數
for(int i=1;i<lineNums;i++) //從第一段線段開始驗算,3的ret次方是否越界。注意是驗算lineNums-1次。
ret = 3*ret % p;
if(b == 0)
return (int)(ret * 3 % p); //剛好被3整數的,要算上前一段
if(b == 1)
return (int)(ret * 4 % p); //被3整數餘1的,要算上前一段 return (int)(ret * 6 % p); //被3整數餘2的,要算上前一段
}
}

以下程式碼是力友寫的程式碼,也可以多看看理解一下。

class Solution {
public int cuttingRope(int n) {
if(n <= 3) return n - 1;
int b = n % 3, p = 1000000007; long rem = 1, x = 3 ,a = n / 3;
//直接套迴圈求餘公式
for(int i = 0; i < ((b == 1)?a-1:a); i++) { //b == 1代表餘數為1的時候,需要單獨取出一個3出來湊成2*2達到最大值效果
rem = (rem * x) % p;
}
if(b == 0) return (int)(rem % p);
if(b == 1) return (int)(rem * 4 % p);
return (int)(rem * 2 % p);
}
}

k神的程式碼可讀性其實有點不高,但確實牛皮格拉斯啊。k神的做題思路建議去面試題14- II. 剪繩子 II(數學推導 / 貪心思想 + 快速冪求餘,清晰圖解) - 剪繩子 II - 力扣(LeetCode) (leetcode-cn.com)這裡在好好研究一下。

class Solution {
public int cuttingRope(int n) {
if(n <= 3) return n - 1;
int b = n % 3, p = 1000000007;
long rem = 1, x = 3;
for(int a = n / 3 - 1; a > 0; a /= 2) {
if(a % 2 == 1) rem = (rem * x) % p;
x = (x * x) % p;
}
if(b == 0) return (int)(rem * 3 % p);
if(b == 1) return (int)(rem * 4 % p);
return (int)(rem * 6 % p);
}
}

參考連結:

https://leetcode-cn.com/problems/jian-sheng-zi-ii-lcof/solution/jian-zhi-offer-14-ii-jian-sheng-zi-iihua-r5op/

https://leetcode-cn.com/problems/jian-sheng-zi-ii-lcof/solution/mian-shi-ti-14-ii-jian-sheng-zi-iitan-xin-er-fen-f/