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

数据范围: 2≤n≤60
进阶:空间复杂度 O(1),时间复杂度O(n)
输入描述:
输入一个数n,意义见题面。
返回值描述:
输出答案。
示例1
输入:
8

返回值:
18

说明:
8 = 2 +3 +3 , 2 *3 *3=18
示例2
输入:
2

返回值:
1

说明:
m>1,所以切成两段长度是1的绳子

方法一:动态规划

一旦分出一段长度为1的小段,只会减少总长度,还不能增加乘积,因此长度为2的绳子不分比分开的乘积大,长度为3的绳子不分比分开的乘积大,长度为4的绳子分成2*2比较大。前面的我们都可以通过这样递推得到,后面的呢?

同样递推!如果我有一个长度为nnn的绳子,我们要怎么确定其分出最大的乘积,我们可以尝试其中一段不可分的为jjj,那么如果另一段n−jn-jn−j最大乘积已知,我们可以遍历所有jjj找到这个最大乘积。因此用dp[i]表示长度为i的绳子可以被剪出来的最大乘积,那么后续遍历每个jjj的时候,我们取最大dp[i]=max(dp[i],j∗dp[i−j])就好

具体做法:

step 1:按照上述思路,不超过3的直接计算
step 2:超过3的不断累乘3,然后number不断减去3,直到最后不超过4。
step 3:最后乘上剩余的数字。

Java实现代码:

import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param n int整型 * @return int整型*/public int cutRope (int n) {// write code hereif (n<3){return n-1;}int[] dp = new int[n+1];dp[1] = 1;dp[2] = 2;dp[3] = 3;dp[4] = 4;for(int i = 5;i<= n;i++)for(int j = 1;j<i;j++)dp[i] = Math.max(dp[i],dp[j]*dp[i-j]);return dp[n];}
}

复杂度分析:

时间复杂度:O(n^2),两层遍历
空间复杂度:O(n),辅助数组dp的空间

方法二:贪心

具体做法:

step 1:按照上述思路,不超过3的直接计算
step 2:超过3的不断累乘3,然后number不断减去3,直到最后不超过4。
step 3:最后乘上剩余的数字。

Java实现代码:

public class Solution {public int cutRope(int target) {//不超过3直接计算if(target <= 3) return target - 1;int res = 1;while(target > 4){//连续乘3res *= 3; target -= 3; }return res * target;   }
}

复杂度分析:

时间复杂度:O(n),其中n为绳子的长度,最坏需要计算n/3次
空间复杂度:O(1),常数级变量,无额外辅助空间

剑指Offer算法笔记(Java)剪绳子相关推荐

  1. 【剑指offer】14、剪绳子

    题目 给一根长度为n的绳子,请把绳子剪成m段(m,n都是整数且1),每段绳子的长度相乘最大乘积是多少?如绳子长度为8,当分别为2,3,3时,此时最大乘积18 思路1 此问题明显包含独立的子问题,用f( ...

  2. 剑指offer面试题14- I. 剪绳子(数学推导)

    题目描述 给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m.n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]-k[m] .请问 k[0]k[1]-k[m ...

  3. java统计一个字符串中每个字符出现的次数_剑指offer算法题054:字符流中第一个不重复的字符...

    推荐阅读:宇宙条的工作总结:一年前还在面试找工作,一年后在面试找工作的学弟学妹们:第一次当面试官的经历分享小编在求职找找工作期间剑指offer上的算法题刷了很多遍,并且每道题小编当时都总结了一种最适合 ...

  4. 剑指Offer第二版Java代码实现

    剑指Offer第二版Java代码实现 A.单例模式 面试题 2:实现Singleton模式 B.面试需要的基础知识 面试题 3:数组中重复的数字 面试题 4:二维数组的查找 面试题 5:替换空格 面试 ...

  5. 剑指offer读书笔记

    剑指offer读书笔记 一.面试的流程 1.浅谈面试的重点 2.面试的形式 3.面试的环节 二.面试的基础知识 1.基础知识 2.数据结构 3.算法和数据操作 三.高质量代码 1.代码的规范性 2.代 ...

  6. 剑指offer算法题028:数组中出现次数超过一半的数字

    小编在求职找找工作期间剑指offer上的算法题刷了很多遍,并且每道题小编当时都总结了一种最适合面试时手撕算法的最优解法.考虑到剑指offer算法题在面试中的高频出现,小编每天和大家分享一道剑指offe ...

  7. 道指mt4代码_剑指offer算法题052:正则表达式匹配

    小编在求职找找工作期间剑指offer上的算法题刷了很多遍,并且每道题小编当时都总结了一种最适合面试时手撕算法的最优解法.考虑到剑指offer算法题在面试中的高频出现,小编每天和大家分享一道剑指offe ...

  8. 剑指offer算法合集

    汇总:Android小白成长之路_知识体系汇总[持续更新中-] 简述 算法,不知道是多少程序猿的痛,对我而言也如此,因此今天开始记录那些刷过的算法题,其中最经典的莫过于剑指offer里的题目,精妙的解 ...

  9. 剑指offer算法题分析与整理(一)

    下面整理一下我在刷剑指offer时,自己做的和网上大神做的各种思路与答案,自己的代码是思路一,保证可以通过,网友的代码提供出处链接. 目录 1.数组中的逆序对 2.二维数组中的查找 3.顺时针打印矩阵 ...

最新文章

  1. bootstrap 新闻列表_kuapingUI 2.2 版本发布,跨屏 UI-bootstrap 大组件 UI 框架
  2. HALCON双目重建
  3. 1.9 matlab字符与字符串
  4. Kettle使用_8 存储过程结合获取系统信息
  5. WPF ClickOnce应用程序IIS部署发布攻略
  6. C++substr()用法
  7. 步步深入MySQL:架构-gt;查询执行流程-gt;SQL解析顺序!
  8. C#:安装Windows服务,动态指定服务名及描述
  9. win7局域网共享设置_局域网硬盘一键共享软件下载-一键共享局域网修复查看设置工具包免费版...
  10. 【Linux驱动开发】串口
  11. pdf增强锐化软件_分享一波图像处理软件神器,绝对牛皮!!
  12. 如何给一小段视频添加音乐
  13. linux-使用screen后台运行命令,防止断网导致异常退出,命令没运行完成
  14. 多周期MACD趋势共振制作的方法
  15. NYU V2数据集提取数据
  16. thinkphp6 think-queue消息队列
  17. graylog源码搭建
  18. m3u8文件格式讲解,Python解析m3u8文件,并获取在线地址
  19. 为什么你总是无法专心学习和工作?顶级心理学家告诉你:都是潜意识的锅
  20. 理财小工具(二)贷款计算器

热门文章

  1. instanceof和getClass区别说明
  2. 四旋翼无人机飞控系统设计(控制信号获取及转化)
  3. 二维数组旋转90度、180度、270度
  4. 红茶和绿茶的区别?具体那些是红茶和绿茶
  5. 空间数据库之空间索引
  6. 终端打开文件夹(Window/Linux/macOS)
  7. python获取实时基金数据由银河证券提供_我用Python写了个金融数据爬虫,半小时干了组里实习生一周的工作量...
  8. 使用re模块获取糗事百科上的笑话
  9. ISCC,Misc:藏在星空中的诗
  10. popstate_H5,API的pushState(),replaceState()和popstate()用法