You are given an integer array ribbons
, where ribbons[i]
represents the length of the ith
ribbon, and an integer k
. You may cut any of the ribbons into any number of segments of positive integer lengths, or perform no cuts at all.
- For example, if you have a ribbon of length
4
, you can:<ul> <li>Keep the ribbon of length <code>4</code>,</li> <li>Cut it into one ribbon of length <code>3</code> and one ribbon of length <code>1</code>,</li> <li>Cut it into two ribbons of length <code>2</code>,</li> <li>Cut it into one ribbon of length <code>2</code> and two ribbons of length <code>1</code>, or</li> <li>Cut it into four ribbons of length <code>1</code>.</li> </ul> </li>
Your goal is to obtain k
ribbons of all the same positive integer length. You are allowed to throw away any excess ribbon as a result of cutting.
Return the maximum possible positive integer length that you can obtain k
ribbons of, or 0
if you cannot obtain k
ribbons of the same length.
Example 1:
Input: ribbons = [9,7,5], k = 3 Output: 5 Explanation: - Cut the first ribbon to two ribbons, one of length 5 and one of length 4. - Cut the second ribbon to two ribbons, one of length 5 and one of length 2. - Keep the third ribbon as it is. Now you have 3 ribbons of length 5.
Example 2:
Input: ribbons = [7,5,9], k = 4 Output: 4 Explanation: - Cut the first ribbon to two ribbons, one of length 4 and one of length 3. - Cut the second ribbon to two ribbons, one of length 4 and one of length 1. - Cut the third ribbon to three ribbons, two of length 4 and one of length 1. Now you have 4 ribbons of length 4.
Example 3:
Input: ribbons = [5,7,9], k = 22 Output: 0 Explanation: You cannot obtain k ribbons of the same positive integer length.
Constraints:
1 <= ribbons.length <= 105
1 <= ribbons[i] <= 105
1 <= k <= 109
class Solution:
def maxLength(self, ribbons: List[int], k: int) -> int:
low, high = 0, 100000
while low < high:
mid = (low + high + 1) >> 1
cnt = 0
for ribbon in ribbons:
cnt += ribbon // mid
if cnt < k:
high = mid - 1
else:
low = mid
return low
class Solution {
public int maxLength(int[] ribbons, int k) {
int low = 0, high = 100000;
while (low < high) {
int mid = (low + high + 1) >> 1;
int cnt = 0;
for (int ribbon : ribbons) {
cnt += ribbon / mid;
}
if (cnt < k) {
high = mid - 1;
} else {
low = mid;
}
}
return low;
}
}
class Solution {
public:
int maxLength(vector<int>& ribbons, int k) {
int low = 0, high = 100000;
while (low < high) {
int mid = (low + high + 1) / 2;
int cnt = 0;
for (auto ribbon : ribbons) {
cnt += ribbon / mid;
}
if (cnt < k) {
high = mid - 1;
} else {
low = mid;
}
}
return low;
}
};
/**
* @param {number[]} ribbons
* @param {number} k
* @return {number}
*/
var maxLength = function (ribbons, k) {
let low = 0;
let high = 100000;
while (low < high) {
const mid = (low + high + 1) >> 1;
let cnt = 0;
for (let ribbon of ribbons) {
cnt += Math.floor(ribbon / mid);
}
if (cnt < k) {
high = mid - 1;
} else {
low = mid;
}
}
return low;
};
func maxLength(ribbons []int, k int) int {
low, high := 0, 100000
for low < high {
mid := (low + high + 1) >> 1
cnt := 0
for _, ribbon := range ribbons {
cnt += ribbon / mid
}
if cnt < k {
high = mid - 1
} else {
low = mid
}
}
return low
}