如果我有一个 (N, M) 形状的二维数组。 我想找到沿 N 轴的最小值的最小总和。 但我对可以使用多少行(M 轴)进行值选择有限制,让这个值作为 L。
对于像这样的数组。
[[ 8 7 7 7 7 7 7 5 6]
[ 5 7 6 5 6 6 7 7 5]
[ 7 8 8 8 5 5 5 6 7]
[ 7 8 7 7 7 6 7 8 5]
[ 0 0 100 100 100 100 100 100 100]
[100 100 100 0 0 100 100 100 100]
[100 100 100 100 100 100 0 0 100]]
我将选择第 1、4、5、6 行。
我正在为这个问题撞墙。而且我无法让 ChatGPT 来解决它。
我有一个强力解决方案是找到所有组合 C(N, C)。 对于每个组合数组,我找到沿 N 的最小值并迭代所有组合。
还有什么更好的办法吗?因为 N 和 M 可能相当大。
恕我直言,您还没有用足够的细节和示例输入和输出来定义问题来确定您的问题。但据我了解,您需要
L
行中的 M
最小值,其中 L <= M
。 M
中的每一行都有 N
种可能性。
如果我对问题的理解是正确的,则在您的示例中为
L = 4
,而必须选择行4,5,6
,因为它们都有一个0
,剩余的一行可以是任何其他剩余行,并且不需要是行 1
,因为所有其他行的最小值都是 5
。
如果我的假设是正确的,那么你能做的最好的就是使用
O(N * M) + O(N * log L)
时间复杂度和O(L)
空间复杂度算法。
理由如下:
O(N * M)
。L
行。这会给你O(N * log L)
。算法的工作原理如下:
L
、hp
。L
,则从最大堆中弹出一个元素。对数时间复杂度 (L)。2
并重复下一行。行数 (N) 呈线性。希望有帮助!