二分查找——Wood Cut
2016-07-22 11:03
363 查看
题目:
给定一个数组,数组中的数字代表原木的长度,现在想把这些木头切割成一些长度相同的小段木头,需要得到的小段的数目至少为
样例
有3根木头
注意
木头长度的单位是厘米。原木的长度都是正整数,我们要求切割得到的小段木头的长度也要求是整数。无法切出要求至少 k 段的,则返回
挑战
O(n log Len), Len为 n 段原木中最大的长度
分析:二分查找,注意当数组和小于k时,也就是每1厘米一段都满足不了k段的时候,返回0。
在1到len之间找最大的正整数,使能data[0]-data[n-1]切割的木头树大于等于k.
给定一个数组,数组中的数字代表原木的长度,现在想把这些木头切割成一些长度相同的小段木头,需要得到的小段的数目至少为
k。当然,我们希望得到的小段越长越好,你需要计算能够得到的小段木头的最大长度。
样例
有3根木头
[232, 124, 456],
k=7, 最大长度为
114.
注意
木头长度的单位是厘米。原木的长度都是正整数,我们要求切割得到的小段木头的长度也要求是整数。无法切出要求至少 k 段的,则返回
0即可。
挑战
O(n log Len), Len为 n 段原木中最大的长度
分析:二分查找,注意当数组和小于k时,也就是每1厘米一段都满足不了k段的时候,返回0。
在1到len之间找最大的正整数,使能data[0]-data[n-1]切割的木头树大于等于k.
public int WoodCut(int[] data,int k) { if(data == null||data.length == 0) return 0; if(Sum(data) < k)//<span style="font-size:14px;color:#000000;">数组和小于k时,也就是每1厘米一段都满足不了k段的时候,返回0</span> return 0; int maxLen=Max(data); int start=1; int end=maxLen; while(start < end-1) { int mid=start+(end-start)/2; if(cutNum(data,mid) >= k) start=mid; else end=mid; } if(cutNum(data,end) >= k) return end; if(cutNum(data,start) >= k) return start; return 0; } public int Max(int[] data) { int max=0; for(int i=0;i<data.length;i++) { if(data[i] > max) max=data[i]; } return max; } public int Sum(int[] data) { int sum=0; for(int i=0;i<data.length;i++) sum+=data[i]; return sum; } public int cutNum(int[] data,int len) { int count=0; for(int i=0;i<data.length;i++) { count+=data[i]/len; } return count; }
相关文章推荐
- java 线程的学习
- JavaScript结合Bootstrap仿微信后台多图文界面管理
- [转]项目管理心得:一个项目经理的个人体会、经验总结
- malloc and calloc
- PAT-B 1031. 查验身份证
- 【SqlServer-函数】
- Swift UITextField各种属性的设置
- Redis增删改查示例
- POJ 1422 二分匹配 最小路径覆盖(邻接表实现)
- 《Java源码分析》:Vector
- python split()函数详解
- RSA算法原理(二)
- Redis内存使用优化与存储
- JUnit教程 --使用@Ignore注解
- 【Mac】使用技巧
- CPU调优
- windows安装mysql5.7zip版方法
- <Python进阶读书笔记>之(一) 函数不定参数传递
- 北斗系统基础知识2(北斗一代定位原理详述)
- 正则表达