算法题求解
题目大概描述:
有一段木块长为n,每一块高为hi,现在想将此木块分为m块,求得他们最小高度之和
例:输入 n=8 m=3 height={1,2,3,4,5,6,7,8}
输出 minheight = 11
我后面去要了答案,给的是这个:
将木板分成(1, 2, 3), (4, 5), (6, 7, 8)三块,高度之和最小为11。
思路:这个问题可以使用二分查找和贪心算法来解决。首先可以找到最大和最小的高度,将它们设为left和right,然后二分查找出一个mid值,然后贪心地将木板切成m块,每块长度为mid,计算出所有小块的高度之和,将其与mid进行比较,如果小于等于mid,则将mid更新为right,否则将mid更新为left。重复上述过程,直到left和right相等,此时的值即为块的高度之和的最小值。
代码实现:
public int minTotalHeight(int n, int m, int[] heights) {
int left = 1, right = 0;
for (int h : heights) {
right = Math.max(right, h);
}
while (left < right) {
int mid = (left + right) / 2;
int count = 0, sum = 0;
for (int h : heights) {
sum += h;
if (sum > mid) {
count++;
sum = h;
}
}
count++;
if (count <= m) {
right = mid;
} else {
left = mid + 1;
}
}
return left;
}
就感觉跟我理解的题目又完全不一样了,因为种种原因不敢去再细问,所以先来这边看能不能寻求答案
有一段木块长为n,每一块高为hi,现在想将此木块分为m块,求得他们最小高度之和
例:输入 n=8 m=3 height={1,2,3,4,5,6,7,8}
输出 minheight = 11
我后面去要了答案,给的是这个:
将木板分成(1, 2, 3), (4, 5), (6, 7, 8)三块,高度之和最小为11。
思路:这个问题可以使用二分查找和贪心算法来解决。首先可以找到最大和最小的高度,将它们设为left和right,然后二分查找出一个mid值,然后贪心地将木板切成m块,每块长度为mid,计算出所有小块的高度之和,将其与mid进行比较,如果小于等于mid,则将mid更新为right,否则将mid更新为left。重复上述过程,直到left和right相等,此时的值即为块的高度之和的最小值。
代码实现:
public int minTotalHeight(int n, int m, int[] heights) {
int left = 1, right = 0;
for (int h : heights) {
right = Math.max(right, h);
}
while (left < right) {
int mid = (left + right) / 2;
int count = 0, sum = 0;
for (int h : heights) {
sum += h;
if (sum > mid) {
count++;
sum = h;
}
}
count++;
if (count <= m) {
right = mid;
} else {
left = mid + 1;
}
}
return left;
}
就感觉跟我理解的题目又完全不一样了,因为种种原因不敢去再细问,所以先来这边看能不能寻求答案
全部评论
这题目啥意思,没懂
蹲
相关推荐