给定一个数组的子数组,它的值是它包含的元素的最大值,它出现奇数次。
我想将数组划分成k个子数组,以最大化子数组值之和。
例如,如果我们有以下数组
5 6 6 3 9,K=2
我们可以按如下方式对其进行分区:
(5)+(6,6,3,9)=(5+9=>14)
(5,6)+(6,3,9)=(6+9=>15)
(5,6,6)+(3,9)=(5+9=>14)
(5,6,6,3)+(9)=(5+9=>14)
我可以用野蛮的方法来做,但是我需要一个有效的算法。你能提出点建议吗

最佳答案

我看到的算法很简单需要在数组中找到k个最大值的位置,然后以最大值包含在每个子数组中的奇数次的方式,以这些位置在不同的子数组中的方式来划分数组。需要特别调查最后一个案子其中一个选项是,如果达到k限制,则尝试获取第一个选项。
因此,对于(6,6,6)和K=2,算法应该是:
找到2个最大元素(如果达到k限制,取第一个k)。在我们的例子中,它是第一个和第二个6。
然后分成子阵(从max到nextmax-1)

(6) + (6,6) => 6

相当有趣的例子是(6,7,6,6)和k=3
预期结果是
(6) + (7,6) + (6) = 19

我的算法不适用于这种情况
伪码:
1. indexes = FindKMaxIndexes() // Use selection algorithm https://en.wikipedia.org/wiki/Selection_algorithm, some variation to save indexes instead of elements values
2. reorder indexes from smallest to largest
3. i = 0
4. for each item in sorted indexes array
4.1 create subarray to include item (from i to current index)
4.2 i = current index + 1

关于java - K个分区子数组之和的最大值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51704846/

10-11 22:35
查看更多