做网站的价格贵吗,重庆seo全面优化,曲阜做网站哪家好,丹徒网站建设机构题目 
给你一根长度为 n 的绳子#xff0c;请把绳子剪成整数长度的 m 段#xff08;m、n都是整数#xff0c;n1并且m1#xff09;#xff0c;每段绳子的长度记为 k[0],k[1]...k[m-1] 。请问 k[0]*k[1]*...*k[m-1] 可能的最大乘积是多少#xff1f;例如#xff0…题目 
给你一根长度为 n 的绳子请把绳子剪成整数长度的 m 段m、n都是整数n1并且m1每段绳子的长度记为 k[0],k[1]...k[m-1] 。请问 k[0]*k[1]*...*k[m-1] 可能的最大乘积是多少例如当绳子的长度是8时我们把它剪成长度分别为2、3、3的三段此时得到的最大乘积是18。 
示例 1 输入: 2输出: 1解释: 2  1  1, 1 × 1  1 示例 2: 输入: 10输出: 36解释: 10  3  3  4, 3 × 3 × 4  36 提示 
2  n  58 解题思路 1.题目要求我们将绳子剪切为乘积最大的 m 段这其中蕴含着一个数学问题就是当我们尽可能将绳子以长度 3等分为多段时乘积最大。这个推论大家可以自己去证明一下。 2.有了这个推论这个问题就轻而易举了 ①切分规则最优 3 。把绳子尽可能切为多个长度为 3 的片段留下的最后一段绳子的长度可能为 0,1,2 三种情况。次优 2。若最后一段绳子长度为 2 则保留不再拆为 11 。最差 1。若最后一段绳子长度为 1 则应把一份 31 替换为 22因为 2×23×1  ②算法流程 当 n≤3 时按照规则应不切分但由于题目要求必须剪成 m1 段因此必须剪出一段长度为 1 的绳子即返回 n−1 。当 n3 时求 n 除以 3 的 整数部分 res 和 余数部分 mod 即 n3res mod 并分为以下三种情况        ①当 b0 时直接返回 3^a        ②当 b1 时要将一个 13 转换为 22因此返回 3^{a-1} *4        ③当 b2 时返回 3^a*2     代码实现 
class Solution {public int cuttingRope(int n) {if(n  2){return 1;}if(n  3){return 2;}int res  n / 3;int mod  n % 3;if(mod  0){return pow(3,res);}else if(mod  1){return pow(3,res - 1) * 4;}else {return pow(3,res) * 2;}}int pow(int i, int k){int sum  1;for(i  1; i  k; i){sum  sum * 3;}return sum;}} 
测试结果