免费网站建设浩森宇特,做农产品的网站名称,建设销售网站,域名注册好怎么建设网站剑指 Offer 14- II. 剪绳子 II
给你一根长度为 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] 可能的最大乘积是多少请把绳子剪成整数长度的 m 段m、n都是整数n1并且m1每段绳子的长度记为 k[0],k[1]…k[m - 1] 。请问 k[0]k[1]…*k[m - 1] 可能的最大乘积是多少例如当绳子的长度是8时我们把它剪成长度分别为2、3、3的三段此时得到的最大乘积是18。
答案需要取模 1e971000000007如计算初始结果为1000000008请返回 1。
示例 1
输入: 2 输出: 1 解释: 2 1 1, 1 × 1 1
贪心法
结论每次拆成n个3如果剩下是4则保留4然后相乘但是这个结论需要数学证明其合理性k神的数学证明
当 n ≤ 3(2, 3) 时按照规则应不切分但由于题目要求必须剪成 m1段因此必须剪出一段长度为 1的绳子即返回 n−1当n 4时可以拆分成22返回结果2*24当n 4时减掉多个3之后剩下的n2, 3, 4 因为2、3不需要再剪了剪了反而变小4剪成2x2是最大的2x2恰巧等于4一个优秀的解释 注意res对1000000007取余一次最后的结果也要取余。 class Solution {
public:int cuttingRope(int n) {if(n 3) return n - 1;if(n 4) return 4;long res 1, p 1000000007;while(n 4){res * 3;res % p;n - 3;}// 最后n的值只有可能是2、3、4。而2、3、4能得到的最大乘积恰恰就是自身值// 因为2、3不需要再剪了剪了反而变小4剪成2x2是最大的2x2恰巧等于4return n * res % p;}
};