【刷题笔记】--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为空则直接返回0
int 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上了。一个不算项目的小项目,现在内容还比较少,大家喜欢可以支持一下。
【刷题笔记】--lintcode木头加工(java)的更多相关文章
- LeetCode刷题笔记(3)Java位运算符与使用按位异或(进制之间的转换)
1.问题描述 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 算法应该具有线性时间复杂度并且不使用额外空间. 输入: [4,1,2,1,2] 输 ...
- 【刷题笔记】火车购票-----java方案
问题描述请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配. 假设一节车厢有20排.每一排5个座位.为方便起见,我们用1到100来给所有的座位编号,第一排是1到5号,第二排是6到10号 ...
- 《Data Structures and Algorithm Analysis in C》学习与刷题笔记
<Data Structures and Algorithm Analysis in C>学习与刷题笔记 为什么要学习DSAAC? 某个月黑风高的夜晚,下班的我走在黯淡无光.冷清无人的冲之 ...
- Python 刷题笔记
Python 刷题笔记 本文记录了我在使用python刷题的时候遇到的知识点. 目录 Python 刷题笔记 选择.填空题 基本输入输出 sys.stdin 与input 运行脚本时传入参数 Pyth ...
- PTA刷题笔记
PTA刷题记录 仓库地址: https://github.com/Haorical/Code/tree/master/PTA/GPLT 两周之内刷完GPLT L2和L3的题,持续更新,包括AK代码,坑 ...
- PAT-甲级刷题笔记和总结
本帖主要记录一些自己在刷题过程中的一些笔记,包括: 1.常用的函数 2.STL中常用方法 3.常见错误 4.其他常用方法 5.刷题过程中的常见算法:https://www.cnblogs.com/M ...
- LeetCode刷题笔记 - 12. 整数转罗马数字
学好算法很重要,然后要学好算法,大量的练习是必不可少的,LeetCode是我经常去的一个刷题网站,上面的题目非常详细,各个标签的题目都有,可以整体练习,本公众号后续会带大家做一做上面的算法题. 官方链 ...
- 《剑指offer》刷题笔记
简介 此笔记为我在 leetcode 上的<剑指offer>专题刷题时的笔记整理. 在刷题时我尝试了 leetcode 上热门题解中的多种方法,这些不同方法的实现都列在了笔记中. leet ...
- 18.9.10 LeetCode刷题笔记
本人算法还是比较菜的,因此大部分在刷基础题,高手勿喷 选择Python进行刷题,因为坑少,所以不太想用CPP: 1.买股票的最佳时期2 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. ...
随机推荐
- NOSDK--关于android傻瓜式的分包设想
一直以来,我总是以“够用就好”为理由,很少再维护过自己的一键打包的项目.最近接触了棱镜的sdk,感觉将apk包上传到棱镜服务器,后台来进行分包这种简单的方式很招人待见. 原理似乎不难,apk即zip压 ...
- 如何实现 javascript “同步”调用 app 代码
在 App 混合开发中,app 层向 js 层提供接口有两种方式,一种是同步接口,一种一异步接口(不清楚什么是同步的请看这里的讨论).为了保证 web 流畅,大部分时候,我们应该使用异步接口,但是某些 ...
- T1加权像(T1 weighted image,T1WI)
T1加权成像(T1-weighted imaging,T1WI)是指这种成像方法重点突出组织纵向弛豫差别,而尽量减少组织其他特性如横向弛豫等对图像的影响. 弛豫:物理用语,从某一个状态恢复到平衡态的过 ...
- 关于JavaScript设计模式(一)
以后都在简书写文章了,所以这个转载我在简书中写的.地址这里 http://www.jianshu.com/p/c7b3c2c148c5
- Linux安装ftp组件过程
1 安装vsftpd组件 安装完后,有/etc/vsftpd/vsftpd.conf 文件,是vsftp的配置文件. [root@bogon ~]# yum -y install vsftpd 2 ...
- 转载:如何让spring mvc web应用启动时就执行
转载:如何让spring mvc web应用启动时就执行特定处理 http://www.cnblogs.com/yjmyzz/p/4747251.html# Spring-MVC的应用中 一.Appl ...
- 关于python装饰器
关于python装饰器,不是系统的介绍,只是说一下某些问题 1 首先了解变量作用于非常重要 2 其次要了解闭包 def logger(func): def inner(*args, **kwargs) ...
- Delaunay剖分与平面欧几里得距离最小生成树
这个东西代码我是对着Trinkle的写的,所以就不放代码了.. Delaunay剖分的定义: 一个三角剖分是Delaunay的当且仅当其中的每个三角形的外接圆内部(不包括边界)都没有点. 它的存在性是 ...
- C语言 活动安排问题之二
有若干个活动,第i个开始时间和结束时间是[Si,fi),活动之间不能交叠,要把活动都安排完,至少需要几个教室? #include <stdio.h> #include <string ...
- [MySQL] 分页优化
在传统的分页思路影响下,很多人都形成了对于分页的固定理解,也就是给出select语句,先用count()函数计算出总的条目,除与每个页面大小pagesize,然后用ceil取整,得出总的页数,用lim ...