https://leetcode-cn.com/problems/jian-sheng-zi-lcof/
给你一根长度为 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。
参考https://leetcode-cn.com/problems/jian-sheng-zi-lcof/solution/jian-zhi-offerer-shua-java-di-gui-bei-wa-1pax/ 添加数学解法
思路:

  1. 暴力递归
    当前绳子长度为n,考虑分出的第一段长度为i,则整个绳子最大乘积情况分为两种
    a. 最大为i * f(n - i) 但是f(n-i)却是n-i没进行切分这种情况
    b. 最大为i * (n - i)
    因为长度分为(i,n-i)与长度分为(n-i,i)的乘积是一样的,所以分出第一段长度只需要考虑1— n/2即可, 超时
class Solution(object):def cuttingRope(self, n):""":type n: int:rtype: int"""if n == 1:return 1if n == 2:return 1if n == 3:return 2result = 0for i in range(1, n / 2 + 1):j = n - ivalue1 = i * self.cuttingRope(j)value2 = i * jresult = max([result, value1, value2])return result
  1. 暴力解法超时,研究其递归过程,计算f(4)时需要计算f(2),计算f(5)时同样需要计算f(2),为重复计算。因此,使用空间换取时间的方式,对已经计算过的n进行记录,节约耗时。但是还是超时
class Solution(object):def cuttingRope(self, n):""":type n: int:rtype: int"""tmp = [0] * (n + 1)if n == 1:return 1if n == 2:return 1if n == 3:return 2result = 0for i in range(1, n / 2 + 1):j = n - iif tmp[j] != 0:value1 = i * tmp[j]    # 改动在这里else:value1 = i * self.cuttingRope(j)value2 = i * jresult = max([result, value1, value2])return result
  1. 递归超时,考虑使用动态规划
class Solution(object):def cuttingRope(self, n):""":type n: int:rtype: int"""tmp = [0] * (n + 1)if n == 1:return 1if n == 2:return 1if n == 3:return 2tmp[0] = 1tmp[1] = 1tmp[2] = 1tmp[3] = 2for i in range(1, n + 1):for j in range(1, i):tmp[i] = max([tmp[i], j * (i - j), j * tmp[i-j]])return tmp[-1]


4. 数学解法
思路:借助一个数学理论,和一定,差小积大。即总和一定情况下,value分布越均匀,则其乘积最大。
所以,如果要切分成m份,则应先给每段均匀分配n/m长度,之后再将n%m长度依次加在刚刚分好的各段上,够加几个加几个,则为当前乘积最大的分配方式。

class Solution(object):def cuttingRope(self, n):""":type n: int:rtype: int"""if n == 2:return 1result = 1for m in range(2, n):   # 分为n段每段是1,只有在2这种没有其余分配方式的情况下才会是最优的,但是因为2直接return了,因此不需要考虑分为n段的情况,判断到n-1即可tmp = 1v = n / m     # 第一次给每段分配的长度r = n % m     # 剩余长度for i in range(0, r):   # 剩余长度分配到的段tmp *= (v+1)for i in range(r, m):  # 剩余长度未分配到的段tmp *= vresult = max(tmp, result)return result


5. 升级版数学规律
分出尽量多的3就是最优分配方案(不要问我为什么,就知道有这个理论,没仔细看)尽量多的3且不要有1,所以最后当大于4的时候,结束循环

class Solution(object):def cuttingRope(self, n):""":type n: int:rtype: int"""if n == 2:return 1if n == 3:return 2result = 1while n > 4:result *= 3n -= 3result = result * nreturn result

剑指 Offer 14- I. 剪绳子(5种方案)相关推荐

  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. 剑指offer——复习1:二叉树三种遍历方式的迭代与递归实现

    剑指offer--复习1:二叉树三种遍历方式的迭代与递归实现 20180905更新:这个博客中的解法不是很好,看相应的LeetCode题目笔记~~~ 我感觉此博客中的说法更容易让人理解:https:/ ...

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

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

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

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

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

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

  7. 力扣OJ 剑指 Offer(1-30)

    目录 剑指 Offer 03. 数组中重复的数字 剑指 Offer 04. 二维数组中的查找 剑指 Offer 05. 替换空格 剑指 Offer 06. 从尾到头打印链表 剑指 Offer 07. ...

  8. 挑战一天(12h)刷完《剑指offer》67题

    提前说明,挑战的人不是我. 大家周末好,我是爱上 B 站的小吴,最近一段时间我在网站 AlgoMooc 录制剑指 Offer 的视频,同时上传了一部分到 B 站,基于推荐算法,B 站疯狂的给我推送如何 ...

  9. 《剑指offer》41~45

    面试题41:数据流的中位数 #include<iostream> #include<vector> #include<queue> #include<func ...

  10. 《剑指offer》c++版本 14.剪绳子

    本题在牛客网剑指offer专项里没看到,原书第二版上有,如题: 这道题是开放的动态规划题,题目中只给了绳子长度,却没定义具体剪多少段,初遇此题,难以下手,看了题解,豁然开朗.设f(n)为常为n的绳子剪 ...

最新文章

  1. mysql. Oracle创建视图,Navicat 教程:Oracle 视图
  2. git rebase/reset小计
  3. 【Android笔记】如何创建列表视图3
  4. 使用C#和Excel进行报表开发(五)-操作单元格边框和颜色 【转】
  5. 自定义控件SettingItemView
  6. 苦了我一年的选择,现在却是我最回味的时光
  7. 从零开始学前端:if判断,for循环,,switch判断 --- 今天你学习了吗?(JS:Day4)
  8. java打包带有外部jar,Eclipse使用总结——使用Eclipse打包带源码的jar包
  9. 修改Ubuntu下的jenkins端口号
  10. 数据结构之红黑树简介
  11. 数据挖掘导论 笔记3
  12. 计算机识别键盘流程,电脑键盘拼音打字操作过程
  13. 谷歌地球离线地图包_水经注全国离线地图都有哪些地图数据?
  14. vb.net 自定义progressbar
  15. 【GitHub Desktop】(GitHub Windows桌面版) 中文汉化,(GitHub客户端汉化,非网页端插件)
  16. 解决Linux连不上外国软件源或者软件源失效
  17. 服务器vga连接显示器不亮,HDMI转VGA显示器不亮怎么办?HDMI转VGA显示器没反应如何处理?...
  18. 数仓OLAP(一)--即席查询 Kylin
  19. word替换妙用:批量去除多余空格、空行、换行2020-11-30
  20. tp801单板微型计算机英文全称,TP801型微型计算机在低压铸造与差压铸造液面加压控制系统中的应用.pdf...

热门文章

  1. 软件测试中等价类划分为,等价类划分法和边界值法
  2. 2018年撰写好文案的三个方面知识
  3. sony相机数据恢复,相机内存卡数据如何恢复
  4. [CSP-S模拟测试]:count(树分块)
  5. 【2】Pretrained Transformer As Universal Computation Engines
  6. AutoCAD与.NET的对应版本关系
  7. C++ 新手必备:文件分割器
  8. FreeBSD 下载 Exif扩展
  9. ubuntu18.04编译GB28181Server
  10. 这群中国女工,接到一个“拯救世界杯”的任务