题目描述:
给定一个整数数组 ribbons 和一个整数 k,数组每项 ribbons[i] 表示第 i 条绳子的长度。对于每条绳子,你可以将任意切割成一系列长度为 正整数的部分,或者选择不进行切割。
例如,如果给你一条长度为 4 的绳子,你可以:
- 保持绳子的长度为
4不变; - 切割成一条长度为
3和一条长度为1的绳子; - 切割成两条长度为
2的绳子; - 切割成一条长度为
2和两条长度为1的绳子; - 切割成四条长度为
1的绳子。
你的任务是找出最大 x 值,要求满足可以裁切出至少 k 条长度均为 x 的绳子。你可以丢弃裁切后剩余的任意长度的绳子。如果不可能切割出 k 条相同长度的绳子,返回 0。
示例 1:
输入: ribbons = [9,7,5], k = 3
输出: 5
解释:
- 把第一条绳子切成两部分,一条长度为 5,一条长度为 4;
- 把第二条绳子切成两部分,一条长度为 5,一条长度为 2;
- 第三条绳子不进行切割;
现在,你得到了 3 条长度为 5 的绳子。
示例 2:
输入: ribbons = [7,5,9], k = 4
输出: 4
解释:
- 把第一条绳子切成两部分,一条长度为 4,一条长度为 3;
- 把第二条绳子切成两部分,一条长度为 4,一条长度为 1;
- 把第二条绳子切成三部分,一条长度为 4,一条长度为 4,还有一条长度为 1;
现在,你得到了 4 条长度为 4 的绳子。
示例 3:
输入: ribbons = [5,7,9], k = 22
输出: 0
解释: 由于绳子长度需要为正整数,你无法得到 22 条长度相同的绳子。
提示:
1 <= ribbons.length <= 10^51 <= ribbons[i] <= 10^51 <= k <= 10^9
直接上代码:
java
class Solution {
public int maxLength(int[] ribbons, int k) {
//绳子的总长度
int sum = 0;
//找到当前绳子的最大长度
int max = 0;
//是否大于等于k,这个一定要记录,因为如果比较sum可能会出现Integer越界变成负的
boolean isOverK = false;
for(int ribbon : ribbons) {
sum += ribbon;
if(!isOverK && sum >= k) {
isOverK = true;
}
max = Math.max(ribbon, max);
}
if(!isOverK) {
return 0;
}
//二分进行尝试
int start = 1;
int end = max;
//定义结果,当然最小可以分割为1的
int ans = 1;
while(start <= end) {
int mid = start + (end - start) / 2;
int num = getNumOfRibbons(ribbons, mid);
if(num < k) {
//说明切割长度太大了,从start~mid-1范围尝试
end = mid - 1;
} else {
ans = Math.max(ans, mid);
//但是还需要尝试更大的
start = mid + 1;
}
}
return ans;
}
/**尝试一下切割成length长度可以切出至少多少条绳子 */
public int getNumOfRibbons(int[] ribbons, int length) {
int ans = 0;
for(int ribbon : ribbons) {
ans += ribbon / length;
}
return ans;
}
}
运行结果:

时间比较紧急,不卷优化了,后期再说吧,先保过