本文转载自【微信公众号:五角钱的程序员,ID:xianglin965】经微信公众号授权转载,如需转载与原文作者联系

文章目录

14. 剪绳子1、 题目链接2、题目描述3、解题思路3.1贪心3.2动态规划

14. 剪绳子

1、 题目链接

Leetcode

https://leetcode.com/problems/integer-break/description/

2、题目描述

把一根绳子剪成多段,并且使得每段的长度乘积最大。

n = 2

return 1 (2 = 1 + 1)

n = 10

return 36 (10 = 3 + 3 + 4)

3、解题思路

3.1贪心

尽可能多剪长度为 3 的绳子,并且不允许有长度为 1 的绳子出现。如果出现了,就从已经切好长度为 3 的绳子中拿出一段与长度为 1 的绳子重新组合,把它们切成两段长度为 2 的绳子。

证明:当 n >= 5 时,3(n - 3) - n = 2n - 9 > 0,且 2(n - 2) - n = n - 4 > 0。因此在 n >= 5 的情况下,将绳子剪成一段为 2 或者 3,得到的乘积会更大。又因为 3(n - 3) - 2(n - 2) = n - 5 >= 0,所以剪成一段长度为 3 比长度为 2 得到的乘积更大。

分析:抽象一下题目就是把n分成很多个数字,要求这些数字的乘积最大,问你最大的乘积是多少?

先找一下规律

* 先举几个例子,可以看出规律来。

* 4 :2 * 2

* 5 :2 * 3

* 6 :3 * 3

* 7 :2 * 2 * 3

* 8 :2 * 3 * 3

* 9 :3 * 3 * 3

* 10:2 * 2 * 3 * 3

* 11:2 * 3 * 3 * 3

* 12:3 * 3 * 3 * 3

* 13:2 * 2 * 3 * 3 * 3

我们发现分解的数字中只有2和3,这样的话乘积才能最大,相对于2,肯定是取3更加的好,所以是能取3的时候一定取3,

当n%3 == 0时,也就是全都是3的时候,这个时候乘积肯定最大

当n%3 == 1时,注意1 * 3……* 3肯定没有2 * 2 * 3 …… * 3大,所以我们应该把一个3拿出来和剩下的那个1组成22的形式

当n%3==2时,2 * 3 * …… * 3的形式乘积最大

时间复杂度:O(1)

package 剪绳子;

/*

作者 :XiangLin

文件 :cutRope.java

IDE :IntelliJ IDEA

*/

public class cutRope {

public int integerBreak(int n){

if(n<2)

return 0;

if (n == 2)

return 1;

if (n == 3)

return 2;

int timesOf3 = n / 3;

if (n - timesOf3 * 3 == 1)

timesOf3 --;

int timesOf2 = (n - timesOf3 * 3)/2;

return (int) (Math.pow(3,timesOf3)) * (int)(Math.pow(2,timesOf2));

}

public static void main(String[] args) {

cutRope c = new cutRope();

int n = 9;

System.out.println(c.integerBreak(n));

}

}

3.2动态规划

时间复杂度O(n^2);空间复杂度:O(n)。

定义函数f(n)为把长度为n的绳子剪成若干段后各段长度乘积的最大值。在剪第一刀时,有n-1种选择,即剪出的第一段绳子长度可能为1,2,3,…,n-1。因此 f ( n ) = max( f ( i ) * f ( n - i ) ),其中0

例如:绳子最初的长度为10,我们可以把绳子剪成长度分别为4和6的两段,也就是f(4)和f(6)都是f(10)的子问题。接下来分别求解这两个子问题。我们可以把长度为4的绳子剪成均为2的2段,即f(2)是f(4)的子问题。同样,我们也可以把长度为6的绳子剪成长度分别为2和4的两段,即f(2)和f(4)都是f(6)的子问题。我们注意到f(2)是f(4)和f(6)的公共的更小的子问题。

package 剪绳子;

/*

作者 :XiangLin

文件 :cutRope1.java

IDE :IntelliJ IDEA

*/

// 动态规划

public class cutRope1 {

public int maxProductAfterCuttingSolution1(int n){

if (n < 2)

return 0;

if (n == 2)

return 1;

if (n == 3)

return 2;

int[] products = new int[n + 1];

// 这里设置的0,1,2,3位置上的数是为了便于计算。

// 当i大于等于4时,数组中第i个元素表示把长度为i的绳子剪成若干段之后各段长度乘积的最大值

products[0] = 0;

products[1] = 1;

products[2] = 2;

products[3] = 3;

int max;

for (int i = 4; i <= n; i++){

max = 0;

for (int j = 1; j <= i/2; j++){

int product = products[j] * products[i - j];

if (max < product){

max = product;

products[i] = max;

}

}

}

return products[n];

}

public static void main(String[] args) {

cutRope1 c = new cutRope1();

int n =9;

System.out.println(c.maxProductAfterCuttingSolution1(n));

}

}

java剪绳子_14. 剪绳子(剑指 Offer 题解Java版)相关推荐

  1. java计算整数出现的次数_[剑指offer题解][Java]1到n整数中1出现的次数

    前言 众所周知,<剑指offer>是一本"好书". 如果你是个算法菜鸡(和我一样),那么最推荐的是先把剑指offer的题目搞明白. 对于剑指offer题解这个系列,我的 ...

  2. java 最大子数组_[剑指offer题解][Java]连续子数组的最大和

    前言 众所周知,<剑指offer>是一本"好书". 如果你是个算法菜鸡(和我一样),那么最推荐的是先把剑指offer的题目搞明白. 对于剑指offer题解这个系列,我的 ...

  3. 11. 旋转数组的最小数字(剑指 Offer 题解Java版)

    文章目录 11. 旋转数组的最小数字 题目描述 题目链接 解题思路 可以借助下图理解过程 代码 11. 旋转数组的最小数字 题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. ...

  4. 【剑指offer】【leetcode精选题集】【Java】剑指offer题解合集 更新中

    Leetcode题集 [剑指offer][JAVA]面试题第[03]题[数组中的重复数字][HashSet] [剑指offer][JAVA]面试题第[04]题[二维数中的查找][数组] [剑指offe ...

  5. java queue 最大值_[剑指offer题解]队列的最大值/滑动窗口的最大值

    前言 众所周知,<剑指offer>是一本"好书". 为什么这么说? 因为在技术面试中,它里面罗列的算法题在面试中出现的频率是非常非常高的. 有多高,以我目前不多的面试来 ...

  6. 【剑指offer】Java版代码(完整版)

    参考链接 [剑指offer]Java版代码(完整版)

  7. 剑指Offer(java答案)

    剑指Offer(java答案) 剑指Offerjava答案 3二维数组中的查找 4替换空格 5从尾到头打印链表 6重建二叉树 7用两个栈实现队列 8旋转数组的最小数字 9斐波那契数列 扩展1跳台阶 扩 ...

  8. 《剑指Offer》Java刷题 NO.36 两个链表的第一个公共结点(链表,等长拼接法,长者先行法,辅助栈)

    <剑指Offer>Java刷题 NO.36 两个链表的第一个公共结点(链表,等长拼接法,长者先行法,辅助栈) 传送门:<剑指Offer刷题总目录> 时间:2020-06-19 ...

  9. 对分查找的最多次数_「剑指offer题解」数组中出现次数超过一半的数字

    关注我--个人公众号:后端技术漫谈 我目前是一名后端开发工程师.主要关注后端开发,数据安全,网络爬虫,物联网,边缘计算等方向. 原创博客主要内容 Java知识点复习全手册 Leetcode算法题解析 ...

最新文章

  1. 推荐8个非常实用的办公软件和网站,效率提升
  2. java 里面matches什么意思_Java Regex中的matches()和find()之间的区别
  3. 给你一碗孟婆汤,你会忘记什么?
  4. 关于axios拿取后端hashMap存的值
  5. win10删除vmware12后,重新安装失败(遗留注册表问题)解决总结
  6. STM32F103系列选型
  7. 决策支持系统(DSS)
  8. 这可能是 Python 里最强的绘制地图神器
  9. NOIP模拟赛 魔方
  10. 搬运:php入门安装教程
  11. 小鑫の日常系列故事(七)——小纸条
  12. python 离散数学 判断单射 双射 满射
  13. win7查看隐藏文件夹
  14. 用pyth写一个代码输入数字到列表中,直到输入空值为止 ,依次将每个数字的最大数挑出来,生成一个新的列表...
  15. 最新版苹果公司开发者账户申请
  16. 《通信网》专题八:接入网技术
  17. 玩游戏4g计算机的内存不足,别再说内存不足了!教你一招彻底解决,电脑运行加速3倍!...
  18. java 个人博客开发_Java实现个人博客系统
  19. 【spark】Cluster deploy mode is not applicable to Spark shells
  20. 鲁棒性、泛化 的解释和区别

热门文章

  1. 涉嫌出售 50 亿个人数据,甲骨文面临集体诉讼
  2. PHP魔鬼训练第二季,设计模式,注册树模式,模版模式,HTTP响应过程,多进程
  3. docker 工具 busybox
  4. 线性代数 矩阵和向量空间
  5. 3d建模自学能学会吗?要学什么?需要学习多久?
  6. CSS ===> 背景图片自适应宽高
  7. 阿里图库使用以及uni引入时注意事项
  8. 力扣题目汇总(二进制表示中质素个数,分糖果,有序数组平方)
  9. PolarDB数据库的CSN机制
  10. hive -e和hive -f的用法