【速看,双100%】剑指 Offer 14- I. 剪绳子 I
生活随笔
收集整理的這篇文章主要介紹了
【速看,双100%】剑指 Offer 14- I. 剪绳子 I
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
立志用最少的代碼做最高效的表達(dá)
給你一根長度為 n 的繩子,請把繩子剪成整數(shù)長度的 m 段(m、n都是整數(shù),n>1并且m>1),每段繩子的長度記為 k[0],k[1]…k[m-1] 。請問 k[0]k[1]…*k[m-1] 可能的最大乘積是多少?例如,當(dāng)繩子的長度是8時(shí),我們把它剪成長度分別為2、3、3的三段,此時(shí)得到的最大乘積是18。
示例 1:
輸入: 2
輸出: 1
解釋: 2 = 1 + 1, 1 × 1 = 1
示例 2:
輸入: 10
輸出: 36
解釋: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36
提示:
2 <= n <= 58
解法一:DP
class Solution {public int cuttingRope(int n) {// 動(dòng)態(tài)規(guī)劃特點(diǎn):問題最優(yōu)解、局部最優(yōu)解、不會(huì)計(jì)算重復(fù)子問題。// 通過自下而上的方式避免計(jì)算重復(fù)子問題。// 為什么這里要這么設(shè)置?/*解決大問題的時(shí)候用到小問題的解并不是這三個(gè)數(shù)真正的dp[1] = 0,dp[2] = 1,dp[3] = 2但是當(dāng)n=4時(shí),4=2+2 2*2=4 而dp[2]=1是不對的也就是說當(dāng)n=1/2/3時(shí),分割后反而比沒分割的值要小,當(dāng)大問題用到dp[j]時(shí),說明已經(jīng)分成了一個(gè)j一個(gè)i-j,這兩部分又可以再分,但是再分不能比他本身沒分割的要小,如果分了更小還不如不分所以在這里指定大問題用到的dp[1],dp[2],dp[3]是他本身*/if(n == 2) return 1; // 分割成1*1(n>1)if(n == 3) return 2; // 分割成1*2int[] dp = new int[n+1];dp[0] = 0; dp[1] = 1; dp[2] = 2; dp[3] = 3;for(int i = 4; i <= n; i++) {for(int j = 1; j <= i/2; j++) {dp[i] = Math.max(dp[i], dp[j]*dp[i-j]);}}return dp[n];} }解法2:規(guī)律
classSolution2 {public int cuttingRope(int n) {if(n < 4) return n-1;int sum = 1;while(n > 4) { sum*=3; n-=3; }sum *= n;return sum;} }總結(jié)
以上是生活随笔為你收集整理的【速看,双100%】剑指 Offer 14- I. 剪绳子 I的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【四重优化,速看】剑指 Offer 13
- 下一篇: 【双百解法】剑指 Offer 15. 二