0
点赞
收藏
分享

微信扫一扫

《剑指offer刷题笔记》13、剪绳子【c++详细题解】

题目

给你一根长度为 《剑指offer刷题笔记》13、剪绳子【c++详细题解】_剑指offer绳子,请把绳子剪成《剑指offer刷题笔记》13、剪绳子【c++详细题解】_时间复杂度_02段(《剑指offer刷题笔记》13、剪绳子【c++详细题解】_时间复杂度_02《剑指offer刷题笔记》13、剪绳子【c++详细题解】_剑指offer 都是整数,《剑指offer刷题笔记》13、剪绳子【c++详细题解】_最大乘积_05 并且 《剑指offer刷题笔记》13、剪绳子【c++详细题解】_数学_06)。

每段的绳子的长度记为《剑指offer刷题笔记》13、剪绳子【c++详细题解】_最大乘积_07

《剑指offer刷题笔记》13、剪绳子【c++详细题解】_数学_08可能的最大乘积是多少?

例如当绳子的长度是 《剑指offer刷题笔记》13、剪绳子【c++详细题解】_数学_09时,我们把它剪成长度分别为《剑指offer刷题笔记》13、剪绳子【c++详细题解】_数学_10《剑指offer刷题笔记》13、剪绳子【c++详细题解】_数学_11《剑指offer刷题笔记》13、剪绳子【c++详细题解】_数学_11、 的三段,此时得到最大的乘积《剑指offer刷题笔记》13、剪绳子【c++详细题解】_最大乘积_13

样例

输入:8

输出:18

思路

(数学) 《剑指offer刷题笔记》13、剪绳子【c++详细题解】_剑指offer_14
这道题目是数学中一个很经典的问题。
下面我们给出证明:

首先把一个正整数 《剑指offer刷题笔记》13、剪绳子【c++详细题解】_最大乘积_15 拆分成若干正整数只有有限种拆法,所以存在最大乘积。
假设 《剑指offer刷题笔记》13、剪绳子【c++详细题解】_最大乘积_16,并且 《剑指offer刷题笔记》13、剪绳子【c++详细题解】_时间复杂度_17是最大乘积。

  1. 显然1不会出现在其中;
  2. 如果对于某个《剑指offer刷题笔记》13、剪绳子【c++详细题解】_剑指offer_18《剑指offer刷题笔记》13、剪绳子【c++详细题解】_剑指offer_19,那么把《剑指offer刷题笔记》13、剪绳子【c++详细题解】_时间复杂度_20拆分成《剑指offer刷题笔记》13、剪绳子【c++详细题解】_时间复杂度_21,我们有《剑指offer刷题笔记》13、剪绳子【c++详细题解】_时间复杂度_22
  3. 如果《剑指offer刷题笔记》13、剪绳子【c++详细题解】_时间复杂度_23,拆成《剑指offer刷题笔记》13、剪绳子【c++详细题解】_数学_24乘积不变,所以不妨假设没有4;
  4. 如果有三个以上的2,那么《剑指offer刷题笔记》13、剪绳子【c++详细题解】_剑指offer_25,所以替换成3乘积更大;
  5. 综上,选用尽量多的《剑指offer刷题笔记》13、剪绳子【c++详细题解】_最大乘积_26,直到剩下《剑指offer刷题笔记》13、剪绳子【c++详细题解】_时间复杂度_27或者《剑指offer刷题笔记》13、剪绳子【c++详细题解】_剑指offer_28时,用《剑指offer刷题笔记》13、剪绳子【c++详细题解】_时间复杂度_27

时间复杂度分析

《剑指offer刷题笔记》13、剪绳子【c++详细题解】_剑指offer比较大时,《剑指offer刷题笔记》13、剪绳子【c++详细题解】_剑指offer 会被拆分成 《剑指offer刷题笔记》13、剪绳子【c++详细题解】_数学_32 个数,我们需要计算这么多次减法和乘法,所以时间复杂度是《剑指offer刷题笔记》13、剪绳子【c++详细题解】_剑指offer_14

代码

class Solution {
public:
int maxProductAfterCutting(int n) {
if(n <= 3 ) return 1*(n-1); //边界问题,至少要剪成两段
int res = 1;
if(n % 3 == 1) res = 4 , n -= 4; //将4剪去
else if(n % 3 == 2) res = 2, n -= 2;
while(n)
{
res *= 3;
n -= 3;
}
return res;
}
};

​​AcWing y总题解​​


举报

相关推荐

剑指offer:14-I.剪绳子

0 条评论