剑指offer:剪绳子
时间:2020-04-28
本文章向大家介绍剑指offer:剪绳子,主要包括剑指offer:剪绳子使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题意描述
给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],...,k[m]。请问k[0]xk[1]x...xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
一、思路一
题目分析:
- 先举几个例子,可以看出规律来。
- 3: 1 * 2
- 4 : 2 * 2
- 5 : 2 * 3
- 6 : 3 * 3
- 7 : 2 * 2 * 3 或者4 * 3
- 8 : 2 * 3 * 3
- 9 : 3 * 3 * 3
- 10:2 * 2 * 3 * 3 或者4 * 3
- 11:2 * 3 * 3 * 3
- 12:3 * 3 * 3 * 3
- 13:2 * 2 * 3 * 3 * 3 或者4 * 3 * 3 * 3
如上图所示,每个输入的乘积最大就是:3^n * 2 * k , k=0,1,2
public int cutRope(int target) {
//1 = 1,2 = 1*1, 3 = 1*2
if(target <= 3 && target >0) return target-1;
int max = 1;
//当target《=4,不再循环,此时target = 0(0*2),1,2(1*2),3,4(2*2)
while(target > 4){
target -= 3;
max *= 3;
}
return target*max;
}
二、思路二
使用动态规划。
- 当target《=3时,对target进行分段,只有一种选择。1 = 1,2 = 1 * 1,3 = 1 * 2
- 当target》=4时,对target进行分段,有多种选择。例如:4 = 1 * 3、2 * 2
- 记录每种分段的最大值。
public int cutRope(int target) {
//target=2、3,乘积《target
if(target == 2) return 1;
if(target == 3) return 2;
int[] dp = new int[target+1];
//当target=1、2、3时,不分段就是最大值。
dp[1] = 1;
dp[2] = 2;
dp[3] = 3;
int res = 0;
//当target》=4时,乘积开始》=target。
for(int i=4;i<=target;i++){
for(int j=1;j<=i/2;j++){ //只计算前一半,当target=3时,1 * 3 = 3 * 1
res = Math.max(res,dp[j]*dp[i-j]);
}
dp[i] = res;
}
return dp[target];
}
原文地址:https://www.cnblogs.com/le-le/p/12794008.html
- 我的WCF之旅(7):面向服务架构(SOA)和面向对象编程(OOP)的结合——如何实现Service Contract的继承
- Linux进程间通信(IPC)机制总览
- 负载均衡 - 综述
- 浅谈ASP.NET的Postback
- WCF版的PetShop之一:PetShop简介[提供源代码下载]
- 维吉尼亚密码及程序实现
- 迪菲-赫尔曼密钥交换
- 分布式系统组件之配置中心
- github 提交报403 forbidden的错误解决
- Apache thrift - 使用,内部实现及构建一个可扩展的RPC框架
- redis主从集群搭建及容灾部署(哨兵sentinel)
- 浅谈ASP.NET的Postback
- redis配置详解(中英文)
- 我所理解的Remoting(1):Marshaling & Activation[下篇]
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 《Scikit-Learn与TensorFlow机器学习实用指南》 第11章 训练深度神经网络(上)
- 海康SDK开发步骤
- 《Scikit-Learn与TensorFlow机器学习实用指南》 第11章 训练深度神经网络(下)
- applet跨域访问的安全性问题(java.security.AccessControlException:access denied)
- JSON解析问题:net.sf.json.JSONException: There is a cycle in the hierarchy!
- 海康相机SDK联合c++标定
- 开发一个Node命令行小玩具全过程--高颜统计工具
- 消息未读之点不完的小红点(Node+Websocket)
- pkg版本规范管理自动化最佳实践
- 数据库驱动问题:MySQLNonTransientConnectionException
- 喜大普奔,es2019登场
- [译] Object.assign 和 Object Spread 之争, 用谁?
- 急速 debug 实战二(浏览器 - 调试线上篇)
- via the 'serverTimezone' configuration property
- 急速 debug 实战一(浏览器-基础篇)