【刷题笔记】--lintcode木头加工(java)
木头加工
题目描述
有一些原木,现在想把这些木头切割成一些长度相同的小段木头,需要得到的小段的数目至少为
k
。当然,我们希望得到的小段越长越好,你需要计算能够得到的小段木头的最大长度。注意事项
木头长度的单位是厘米。原木的长度都是正整数,我们要求切割得到的小段木头的长度也要求是整数。无法切出要求至少 k 段的,则返回
0
即可。样例
有3根木头
[232, 124, 456]
,k=7
, 最大长度为114
,则返回114
。
简单分析
暴力解法就是从1开始遍历所有的长度,对于长度L,计算所有木头可以切多少段,如果满足要求就记录长度并继续增加,如果不满足则终止循环,并返回记录的长度L。
暴力解法的复杂度是O(n*m)其中n是木头数组的长度,m指的是数组中数据最大值,因为对于每一个长度都需要遍历整个数组,而最后的数组大小基本正比于数组中的最大值。
在暴力解法的基础上,我们可以改进为O(n*log m)复杂度的算法,先找到最长的木头长度maxl(数组中的最大值),然后利用二分法搜索0-maxl之间的值,最后输出满足要求的最大值。
程序
public int woodCut(int[] L, int k) {int l = L.length;if(l == 0) return 0; //如果输入数组L为空则直接返回0int maxL = L[0]; //找到数组中的最大值for(int i = 1; i < l; i++){int temp = L[i];if(temp > maxL){maxL = temp;}}int up = maxL;int down = 0;int res = 0;while(up >= down){ //二分法查找int len = down + (up - down)/2;if(len == 0) return 0;int c = count(L,len);if(c >= k) {res = res>=len?res:len;down = len + 1;} //符号是>=else if(c < k) up = len - 1;}return res;}public int count(int[] L,int length){int num = 0;for(int l:L){num += l/length;}return num;}
}
上面的算法运行速度仍然很慢,在lintcode网站提交以后运行时间是3s以上,很慢。大家可以试着优化一下。
ps:提供一个教训,我是想法是,当最后分割的长度正好是k段时,我再更新最终的结果长度res。也就是把二分搜索部分修改如下
while(up >= down){int len = down + (up - down)/2;if(len == 0) return 0;int c = count(L,len);if(c < k) up = len - 1;else{ if(c == k) res = res>=len?res:len; down = len + 1;}}
首先,上面这个程序是错误的。如果最大值对应的段数不是k的话,那我们的程序就无法输出正确结果。这是我个人尝试中的一点经验。
一些闲话:
博客这边更新的题目都是略带难度的,还有一些只需要简单技巧的题目就不在这里写了,尽量写在github上了。一个不算项目的小项目,现在内容还比较少,大家喜欢可以支持一下。
转载于:https://www.cnblogs.com/GuoYaxiang/p/6127404.html
【刷题笔记】--lintcode木头加工(java)相关推荐
- java二叉树转换为链表_leetcode刷题笔记-114. 二叉树展开为链表(java实现)
leetcode刷题笔记-114. 二叉树展开为链表(java实现) 题目描述 给你二叉树的根结点 root ,请你将它展开为一个单链表: 展开后的单链表应该同样使用 TreeNode ,其中 rig ...
- 牛客网java刷题笔记2019-1-4
牛客网java刷题笔记 2019-1-4 1.java中可以用类中构造器调用其他类构造器(这个和C++中构造函数很类似)用于初始化程序变量值, 构造器和方法的区别: 功能和作用的不同 构造器是为了创建 ...
- leetcode刷题java、c++、go语言三合一版本 谷歌师兄的刷题笔记、东哥的算法小抄、 Guide哥的Java面试突击版
不久前火爆 GitHub 的 LeetCode 中文刷题手册,分享给大家,让正在找工作的朋友能够快速找到心仪的offer! <LeetCode Cookbook>目前已经收录了 520 道 ...
- 我收藏的谷歌和阿里大佬的刷题笔记
金三银四大家在准备校招.社招,或者闲暇的时候,都可以刷刷 Leetcode,保持良好的手感. 之前刷题,一直觉得漫无目的地刷,效率很低.后来发现了两个刷题笔记,谷歌大佬高畅和BAT大佬霜神写的 Lee ...
- 卷进大厂系列之LeetCode刷题笔记:二分查找(简单)
LeetCode刷题笔记:二分查找(简单) 学算法,刷力扣,加油卷,进大厂! 题目描述 涉及算法 题目解答 学算法,刷力扣,加油卷,进大厂! 题目描述 力扣题目链接 给定一个 n 个元素有序的(升序) ...
- 《编程能力基础》刷题笔记(41 题)
<编程能力基础>刷题笔记 1. 单调数列 题解:递归.模拟.API 2. 实现 strStr() 题解:API.暴力.滑动窗口 3. 平衡二叉树 题解:迭代 4. 重复的子字符串 题解:模 ...
- LeetCode《编程能力入门》刷题笔记(34 题全)
LeetCode<编程能力入门>刷题笔记 基本数据类型 1. 在区间范围内统计奇数数目 _解法1:暴力迭代 _解法2:数学(找规律) 2. 去掉最低工资和最高工资后的工资平均值 _解法1: ...
- 《剑指 Offer I》刷题笔记 51 ~ 61 题
<剑指 Offer I>刷题笔记 51_60 位运算(简单) 51. 二进制中 1 的个数 _解法1:逐伟判断 解法2:巧用 n&(n-1) 52. 不用加减乘除做加法(背题) 解 ...
- 《剑指 Offer I》刷题笔记 41 ~ 50 题
<剑指 Offer I>刷题笔记 41_50 排序(中等) 41. 最小的k个数# _解法1:排序 API + 数组复制 API 42. 数据流中的中位数 _解法1:暴力 搜索和回溯算法( ...
- 《剑指 Offer I》刷题笔记 20 ~ 30 题
<剑指 Offer I>刷题笔记 20_30 动态规划(简单) 20. 斐波那契数列 _解法1:迭代 解法2:记忆化递归 解法3:动态规划 21. 青蛙跳台阶问题 _解法1:动态规划 22 ...
最新文章
- 立体视觉动态测量技术
- HttpApplication IHttpAsyncHandler, IHttpHandler, IComponent, IDisposable ps url System.Web.dll
- 适合做公安网的php,gonganbeian.php
- 深度学习 Deep Learning with MATLAB(懒人版)
- Log4j 1使用教程
- SQL Server 索引使用和优化
- 超市买苹果变量的定义和使用
- Javascript设计模式
- netflix_Netflix的Polynote
- 优化技巧一、UITableView加载图片
- C/C++常量数据类型
- pip慢?半分钟解决方案
- 《Fortran 95 程序设计》阅读笔记三
- java 代码走查_java代码走查计划书
- 计算机技术和通信技术的关系,计算机技术与通信技术的关系
- android技巧:dumpsys简化信息查看Activity结构
- Veil-Evasion免杀
- [SLAM基础学习简记]非线性优化
- mahout实现协同过滤推荐算法
- MacBook解决控制台图标问题
热门文章
- POJ2404:Jogging Trails
- CDH5.15.0+spark1.6.0+hive1.1集群与zeppelin0.8.1+spark-notebook打通踩坑总结
- C++中对字符串的操作
- ExpandableListView的箭头问题
- 微信小程序开发多少钱 怎么看价格成本
- Kaggle超市客户分类-KMeans无监督案例
- 多模态理论张德禄_学术会议 | 适用语言学与多模态国际会议
- c 语言指针数组长度,c如何获取指针数组的长度?
- Google Earth Engine(GEE)——哥白尼大气监测 (CAMS) 全球气溶胶AOI近实时观测数据集
- 情感分析的一些专业术语