劍指 Offer 14- II. 剪繩子 II
劍指 Offer 14- II. 剪繩子 II 參考面試題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
基本思路:由於要取模,剪繩子I的動態規劃方案不能用了,本題另外一種思路:貪心,剪成多少段(k)最大?每一段(x)多長合適?
- 直觀想法k段一樣長時最大
算數幾何不等式: 其中
- 每一段的長度x多大合適?越大越好?直覺上是2或者3,因為若n=200 ,2^100>100*100;
該問題等價於,n=kx,求y=x^k使其最大。,等價於x取何值時,最大,令,兩邊取對數,然後求導,x=e時最大,最接近e的整數為3,可以適當的對比下2和3
結論:對於一個給定長度的繩子, 當所有繩子段等長且每段繩子長度為3時,乘積最大,
class Solution {
public:
const int mod=1e9+7;
int cuttingRope(int n) {
if(n<4)
return n-1;
int a=n/3-1; //預留
int b=n%3;
int dp[3]={3,4,6};
long long x=3;
long long remain=1;
while(a>0){
if(a&1){
remain=remain*x%mod;
}
x=x*x%mod; //快速冪的思想
a/=2;
}
return remain*dp[b]%mod;
}
};
相關文章
- 劍指 Offer 14- I. 剪繩子 JavaScript實現JavaScript
- 劍指 Offer 59 - II. 佇列的最大值佇列
- # 劍指 Offer 68 - II. 二叉樹的最近公共祖先二叉樹
- 劍指 Offer 10- II. 青蛙跳臺階問題JavaJava
- 劍指 Offer 57 - II. 和為s的連續正數序列
- 劍指 Offer 32 - II. 從上到下列印二叉樹 II 做題筆記二叉樹筆記
- 剪繩子
- 劍指 Offer 53 - II. 0~n-1中缺失的數字(二分法)1
- JZ-067-剪繩子
- JZ67-剪繩子
- 劍指Offer 撲克牌順子
- 劍指OFFER
- 劍指offer-17:樹的子結構
- python 實現 割繩子問題(劍指offer 14題) 動態規劃 或者貪心演算法Python動態規劃演算法
- 劍指offer導航
- Leetcode劍指offer(八)LeetCode
- 劍指offer16
- 劍指 offer20
- 劍指 offer21
- 劍指Offer題解合集
- 【劍指Offer】矩形覆蓋
- 劍指offer——跳臺階
- 六、劍指 Offer(25~29)
- 劍指offer-JavaScript版JavaScript
- 劍指 Offer 42.連續子陣列的最大和陣列
- 劍指Offer-連續子陣列中的最大和陣列
- 【leetcode】劍指 Offer II 105. 島嶼的最大面積-【深度優先DFS】LeetCode
- 劍指 Offer 48. 最長不含重複字元的子字串字元字串
- 劍指offer-例題 連續子陣列的最大和陣列
- 《劍指Offer》- 連續子陣列的最大和或最小和陣列
- 劍指offer刷題記錄
- 劍指offer-第2章
- 劍指offer第41~50題
- 劍指 offer(1) -- 陣列篇陣列
- 【劍指offer】【2】字串的空格字串
- leetcode 劍指 Offer 48. 最長不含重複字元的子字串LeetCode字元字串
- 劍指 Offer 38. 字串的排列字串
- 《劍指 Offer》棧實現佇列佇列