1.剑指 Offer 14- I. 剪绳子
2=1+1,3=1+2,
4 = 2 + 2,5 = 3 + 2,6 = 3 + 3,7 = 3 + 4,8 = 3 + 5 = 3 + 3 + 2,9 = 5 + 4 = 3 + 2 + 4. . . . . .
可以发现,其实从4开始,每个数字都可以由2和3组成,尽可能的多分出一些3乘积就会大些
举个栗子:8 = 3 + 5,当3和5(3 + 2)各自的乘积取最大值,两者再相乘那么8就会取得乘积的最大值。同样的每个数字都可以这样拆分,每个拆分出来的数分别取得乘积的最大值,把这些最大值相乘就得到我们要求的(有种动态规划的感觉,就是这个数的最大乘积取决于 前面组成它的数 的最大乘积)
2和3要单独处理,因为它们不得不 要拆分出一个1来,while(n – 3 > 1) ,这个条件是,如果最后剩下的n不大于4,就直接相乘。为什么如果最后是4要直接退出循环乘4呢,因为最后4继续减3处理的话4会被拆分成4 = 3 +1;但是中间不能直接减去一个4然后乘4,只有最后只剩下4的时候才可以(5 = 3 + 2,5 = 4 + 1;6 = 3 + 3,6 = 4 + 2,都是前者更大)
1 class Solution { 2 public: 3 int cuttingRope(int n) { 4 if(n <= 3) return n - 1; 5 int res = 1; 6 while(n - 3 > 1){ //一直减3,减一个3就乘一个3 7 res *= 3; 8 n -= 3; 9 } 10 res = res * n; 11 return res; 12 } 13 };
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/275603.html