有一些原木,现在想把这些木头切割成一些长度相同的小段木头,需要得到的小段的数目至少为 k。给定L和k,你需要计算能够得到的小段木头的最大长度。
二分法
小段木头的长度区间为[0,最长的那根木头]
对长度区间进行二分 判断mid长度是否可以用现有木头分成k段
若可以分成k段 说明小段木头可能更长 删除比mid短的区间 反之同理
public class Solution {
/**
* @param L: Given n pieces of wood with length L[i]
* @param k: An integer
* @return: The maximum length of the small pieces
*/
public int woodCut(int[] L, int k) {
int l = 0;
int r = 0;
if(L == null || L.length == 0)
return 0;
for(int num : L){
r = Math.max(r, num);
}
while(l + 1 < r){
int mid = l + (r - l) / 2;
if(count(L, mid) >= k){
l = mid;
}
else
r = mid;
}
if(count(L, r) == k)
return r;
return l;
}
public int count(int[] L, int len){
int count = 0;
for(int num : L){
count += num / len;
}
return count;
}
}