- Wood Cut
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
For L=[232, 124, 456], k=7, return 114.
Challenge
O(n log Len), where Len is the longest length of the wood.
Notice
You couldn’t cut wood into float length.
If you couldn’t get >= k pieces, return 0.
思路:这题跟copy book那题很相似。最小值最大化,贪婪+二分。
注意最小值可以从1开始,最大值则可选木头的最大长度。
class Solution {
public:
/**
* @param L: Given n pieces of wood with length L[i]
* @param k: An integer
* @return: The maximum length of the small pieces
*/
int woodCut(vector<int> &L, int k) {
int len = L.size();
if (len == 0) return 0;
//int minLen = INT_MAX, maxLen = 0;
int maxLen = 0;
for (int i = 0; i < len; ++i) {
// minLen = min(minLen, L[i]);
maxLen = max(maxLen, L[i]);
}
int start = 1, end = maxLen;
while (start + 1 < end) {
int mid = start + (end - start) / 2;
if (qualify(L, k, mid)) {
start = mid;
} else {
end = mid;
}
}
if (qualify(L, k, end)) return end;
if (qualify(L, k, start)) return start;
return 0;
}
private:
bool qualify(vector<int> &L, int k, int l) {
int len = L.size();
int count = 0;
for (int i = 0; i < len; ++i) {
count += L[i] / l;
}
return count >= k;
}
};