【发布时间】:2020-12-22 21:35:23
【问题描述】:
我只能想出一种蛮力的方法来解决这个问题。有兴趣看看 Algo SO 社区会想出什么。
给出一个 arr a 和一个整数 x (1max(s1) + max(s2)....+ max(sx) 的和是子数组和的所有可能组合中的最小值(参见下面的示例)。返回一个具有 x-1 个索引的数组,其中包含索引 i(不包括),其中发生拆分 a[0:i], a[i+1:i2], a[i2+1: i3].....a[ix:]。
例子:
a = [10,30,40,20,50]
x = 2
return = [1]
将索引 1 处的数组拆分为 [10] 和 [30,40,20,50]
将导致max([10]) + max([30,40,20,50]) = 60,这是所有其他拆分数组的方法中的最小值。
其他可能的拆分 -
- 不能在索引 0 处拆分,因为那样只会产生 1 个数组和 x = 2
- 在索引 2 处拆分 = max([10,30]) + max([40,20,50]) = 80
- 在索引 3 处拆分会产生 90
- 在索引 4 处拆分会产生 90
- 不允许在索引 5 处拆分,因为这样只会产生 1 个数组和 x = 2
【问题讨论】:
-
我会更新问题。子数组可能组合的所有可能总和中的最小值(拆分数组的其他方法)
-
所以你不想要蛮力?
-
@adirabargil 蛮力需要指数级的时间。动态编程采用
O(len(a) * x)。即使使用速度很快的计算机,您通常也不需要蛮力。 -
你不会总是在列表末尾划分最小的项目以便将较大的项目组合在一起吗?给定一个大于 1 的
n,您将把最小的项目从末尾分区,以相同的方式递归地寻址其余的项目? -
@MarkMeyer,arr 不应重新排序。我将添加说明