Algorithm 如何以最小化每个分区总和最大值的方式对整数数组进行分区?

Algorithm 如何以最小化每个分区总和最大值的方式对整数数组进行分区?,algorithm,language-agnostic,partitioning,Algorithm,Language Agnostic,Partitioning,输入是一个由正整数或空整数和另一个整数K组成的数组 我们应该将A划分为K个连续元素块(所谓“划分”是指A的每个元素都属于某个块,2个不同的块不包含任何共同的元素) 我们将块的和定义为块元素的和 目标是在K个块中找到这样一个分区,使得每个块的最大和(我们称之为“MaxSumBlock”)最小化 我们需要输出MaxSumBlock(不需要找到实际的分区) 以下是一个例子: 输入: A = {2, 1, 5, 1, 2, 2, 2} K = 3 预期产出: MaxSumBlock: 6 (with

输入是一个由正整数或空整数和另一个整数K组成的数组

我们应该将A划分为K个连续元素块(所谓“划分”是指A的每个元素都属于某个块,2个不同的块不包含任何共同的元素)

我们将块的和定义为块元素的和

目标是在K个块中找到这样一个分区,使得每个块的最大和(我们称之为“MaxSumBlock”)最小化

我们需要输出MaxSumBlock(不需要找到实际的分区)

以下是一个例子:

输入:

A = {2, 1, 5, 1, 2, 2, 2}
K = 3
预期产出:

MaxSumBlock: 6
(with partition: {2, 1}, {5, 1}, {2, 2, 2})
在预期输出中,每个块的和分别为3、6和6。最大值为6

这是一个非最佳分区:

partition: {2, 1}, {5}, {1, 2, 2, 2}
在这种情况下,每个区块的总和为3、6和7。因此,最大值为7。这不是一个正确的答案

什么算法可以解决这个问题

编辑:K,并且A的大小不大于100000。A的每个元素都不大于10'000

使用二进制搜索


让最大和的范围从0到和(数组)。因此,mid=(范围/2)。查看是否可以通过在O(n)时间内划分为
k
集来实现mid。如果是,则选择较低的范围,如果不是,则选择较高的范围。

这将在O(n log n)中给出结果

PS:如果您在编写代码方面有任何问题,我可以提供帮助,但我建议您先自己尝试一下

编辑:
根据要求,我将解释如何通过在O(n)时间内划分为
k
集合来找到
mid


迭代元素,直到总和小于或等于
mid
。一旦它大于
mid
,就让它成为下一组的一部分。如果你得到
k
或更少的集合,
mid
是可以实现的,否则就不行了。

数组和k的大小有什么限制?刚刚编辑了我的问题动态规划(随着A和k的增加)?@KarolyHorvath我想到了DP,但在我看来,复杂度是N^2,这对于100kVery类似的问题来说似乎太多了:“看看是否可以通过在O(n)时间内划分成k个集合来实现mid。”-如何实现?请详细说明,否则答案有点不完整。(我想我知道如何实现,但可能不是每个人都清楚)我们还可以确定最大和范围的下限:max(数组)。谢谢你的回答!我考虑过在给定MaxSumBlock的情况下找到一个最小分区,但我不知道为什么我没有想到简单地遍历阵列的明显解决方案这里的时间复杂性不是
O(n log range)