算法题求解

题目大概描述:

有一段木块长为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;
}

就感觉跟我理解的题目又完全不一样了,因为种种原因不敢去再细问,所以先来这边看能不能寻求答案

全部评论
这题目啥意思,没懂
点赞 回复 分享
发布于 2023-05-04 14:01 山东
点赞 回复 分享
发布于 2023-05-04 17:30 湖北

相关推荐

不愿透露姓名的神秘牛友
10-15 14:22
点赞 评论 收藏
分享
点赞 1 评论
分享
牛客网
牛客企业服务