Given n pieces of wood with length L[i]
(integer array). Cut them into small pieces to guarantee you could have equal or more than k pieces with the same length. What is the longest length you can get from the n pieces of wood? Given L & k, return the maximum length of the small pieces.
Example
Example 1
Input:
L = [232, 124, 456]
k = 7
Output: 114
Explanation: We can cut it into 7 pieces if any piece is 114cm long, however we can't cut it into 7 pieces if any piece is 115cm long.
Example 2
Input:
L = [1, 2, 3]
k = 7
Output: 0
Explanation: It is obvious we can't make it.
Challenge
O(n log Len), where Len is the longest length of the wood.
Notice
You couldn't cut wood into float length.
思路:直接求,比较难求,但是我们可以二分解空间;
K 800 400 ..... 8 7 6
L 1 2 ...... x-1 x x+1
也就是如果L持续增大,那么能够切出来的整块在减少,那么就有个递增和递减的关系,L越大,K越小;反之亦然;
那么就可以用二分法;把一个求解最值的问题,变成一个判定性问题;
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) {
if(L == null || L.length == 0) {
return 0;
}
int start = 0;
int end = 0;
for(int l: L) {
end = Math.max(end, l);
}
while(start + 1 < end) {
int mid = start + (end - start) / 2;
if(cancut(L, mid) >= k) {
start = mid;
} else {
end = mid;
}
}
if(cancut(L, end) >= k) {
return end;
}
return start;
}
private int cancut(int[] L, int len) {
int count = 0;
for(int l : L) {
count += l / len;
}
return count;
}
}