day24


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

(0)
上一篇 2022年7月20日
下一篇 2022年7月20日

相关推荐

发表回复

登录后才能评论