剑指 Offer 14- II. 剪绳子 II

题目描述

给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m - 1] 。请问 k[0]k[1]…*k[m - 1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

解答

class Solution {/**剪绳子乘积的最大值的推论推论一:将绳子以相等的长度等分为多段,得到的乘积最大推论二:尽可能将绳子以长度3等分为多段时,乘积最大由推论可得出,切分规则为:最优:3。把绳子尽可能切为多个长度为3的片段,留下的最后一段绳子的长度可能为0,1,2三种情况,留下的长度为0为最优,代表全部等分为长度为3的片段次优:2。若最后一段绳子长度为2;则保留,不再拆分为1+1最差:1。若最后一段绳子长度为1;则应把一份3+1替换为2+2,因为2 x 2 > 3 x 1算法流程:当n <= 3时,按照规则应不切分,但由于题目要求必须剪成m>1段,因此必须剪出一段长度为1的绳子,即返回n-1当n > 3时,求n除以3的整数部分a和余数部分b(即n = 3a+b),并分为以下三种情况当b=0时,直接返回3^a % 1000000007当b=1时,要将一个1+3转换为2+2,因此返回 (3^a-1 × 4)%1000000007当b=2时,返回(3^a × 2)%1000000007当 a 增大时,最后返回的 3^a大小以指数级别增长,可能超出 int32 甚至 int64 的取值范围,导致返回值错误。所以我们可以在计算的过程中对中间的计算结果取余以确保最后计算结果的准确性。求余运算规则 (xy)%p = [(x%p)(y%p)]%p由求余运算规则,可得x^a%p = ((x^a-1 % p)x)%p   //循环求余法,即在a个x乘在一起时,每乘一个x对p取一次余*/public int cuttingRope(int n) {if(n <= 3){return n-1;}int a = n/3;int b = n%3;// res*3可能在求余之前超出int的取值范围,所以用longlong res = 1;int p = 1000000007;for(int i = 1;i < a;i++){  //因为最后一个3可能根据余数的不同可能需要拆分,所以在这先成a-1个3res = (res * 3)%p;}if(b==0){  //最优res = (res * 3)%p;}else if(b == 2){  //次优res = (res * 3 * 2)%p;}else if(b == 1){   //最差res = (res * 2 * 2)%p;}return (int)res;}
}

剑指 Offer 14- II. 剪绳子 II相关推荐

  1. 【LeetCode】【剑指offer】【剪绳子(二)】

    剑指 Offer 14- II. 剪绳子 II 给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m.n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]... ...

  2. 【LeetCode】剑指 Offer 14. 剪绳子

    [LeetCode]剑指 Offer 14. 剪绳子 文章目录 [LeetCode]剑指 Offer 14. 剪绳子 两道题目的区别在于第二题 n 的取值范围更大 package offer;publ ...

  3. 【LeetCode笔记】剑指 Offer 14. 剪绳子 I II(Java、动态规划、偏数学)

    文章目录 剪绳子 I 题目描述 思路 && 代码 1. 动态规划 O(n2n^2n2).O(n) 2. 最优解:数学方法 O(n).O(1) 二刷 剪绳子 II 题目描述 思路 &am ...

  4. 剑指Offer #14 链表中倒数第k个结点(快慢指针) | 图文详解

    题目来源:牛客网-剑指Offer专题 题目地址:链表中倒数第k个结点 题目描述 输入一个链表,输出该链表中倒数第k个结点. 节点结构如下: public class ListNode {int val ...

  5. 剑指 Offer 14.剪绳子(动态规划、数学分析)

    一.题目内容 二.题目分析 这道题目讲道理,我看到的第一眼就是动态规划,但是后来提交之后,发现还有大佬考虑用数学分析得出精简解法,在这里我也会一 一阐述. 对于动态规划而言,按照老套路,首先定义dp数 ...

  6. 剑指offer:面试题32 - II. 从上到下打印二叉树 II

    题目:从上到下打印二叉树 II 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行. 例如: 给定二叉树: [3,9,20,null,null,15,7], 3    / \ ...

  7. 剑指Offer LeetCode 面试题58 - II. 左旋转字符串

    面试题58 - II. 左旋转字符串 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部.请定义一个函数实现字符串左旋转操作的功能.比如,输入字符串"abcdefg"和 ...

  8. 【剑指offer】面试题32 - II:从上到下打印二叉树 II(Java)

    从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行. 例如: 给定二叉树: [3,9,20,null,null,15,7], 3    / \   9  20     /  \ ...

  9. 【剑指offer】面试题58 - II:左旋转字符串(Java)

    字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部.请定义一个函数实现字符串左旋转操作的功能.比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结 ...

  10. 【剑指offer】面试题57 - II:和为s的连续正数序列(Java)

    输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数). 序列内的数字由小到大排列,不同序列按照首个数字从小到大排列. 示例 1: 输入:target = 9 ...

最新文章

  1. python移动窗口函数
  2. RabbitMQ在windows系统安装部署文档
  3. [题解]CEOI 2004 锯木厂选址
  4. (转载)OC学习篇之---KVC和KVO操作
  5. Windows phone 8 学习笔记(4) 应用的启动
  6. netlink怎么读_内核交互 netlink,检测部分进程死亡和启动。
  7. 第32月第8天 打包 Framework 时使用 CocoaPods 引入第三方库的方法
  8. java中equals的理解(1)
  9. 使用datagrid时json的格式
  10. RS232与RS485
  11. ETL、BI、MMP数据库
  12. 使用Appium进行Android自动化测试遇到编译不成功的错误处理
  13. 计算机中win是哪个版本,win7系统应该选择哪个版本比较好
  14. 基于java的oa协同办公系统_基于java的OA系统设计 毕业论文.doc
  15. 学习记录514@react使用antd选择器设置下拉菜单宽度
  16. Laravel 博客开发|Laravel 项目中安装和使用 Bulma
  17. Chrome 68 运行后整个浏览器窗口变黄/粉色问题修正方法
  18. seafile私有云盘搭建全过程记录
  19. 数仓实时数据同步 debezium
  20. Java中资源文件获取源码浅析

热门文章

  1. 不知道为什么输入12345,不能输出54321(c语言)
  2. 微信小程序https端口指定(非443)
  3. python 链表分割
  4. java读取properties文件并修改、新增属性值
  5. oracle有没有boolean类型,oracle有Boolean类型
  6. failed to parse json-----解析json失败
  7. 编写php用什么开发环境,php开发环境的搭建和使用
  8. a标签下载和window.location.herf下载
  9. OSChina 周二乱弹 —— 下了这场大雨我这汽车一辈子不用燃料了
  10. 一个简单的图片管理小工具