1

假设您有一个有序的、索引的正值列表。这些正值被 0 值中断。我想确定是否存在不被 0 值中断且总和超过某个阈值的连续子数组。

简单的例子:

Index, Value
0   0
1   0
2   3
3   4
4   2
5   6
6   0
7   0
8   0
9   2
10  3
11  0

在上面的例子中,没有被 0 中断的最大连续子数组是从 index2到 index5包括在内,这个子数组的和是15

因此,对于以下阈值和20,结果应分别为和。104FALSETRUETRUE

注意我不一定要找到最大的子数组,我只需要知道是否有任何不间断的子数组总和超过定义的阈值。

我怀疑这个问题是 Kadane 算法的变体,但我不太清楚如何调整它。

增加的复杂性是我必须在 Excel 或 Google 表格中执行此分析,而且我不能使用脚本来执行此操作 - 只能使用内置公式。

我不确定这是否可以做到,但我将不胜感激任何意见。

4

3 回答 3

1

从...开始

=B2

在c2

然后放

=IF(B3=0,0,B3+C2)

在 C3 中并复制下来。

在此处输入图像描述

编辑 1

如果您正在寻找 Google 表格解决方案,请尝试以下操作:

=ArrayFormula(max(sumif(A2:A,"<="&A2:A,B2:B)-vlookup(A2:A,{if(B2:B=0,A2:A),sumif(A2:A,"<="&A2:A,B2:B)},2)))

假设 B 列中的数字从零开始:如果不是,则需要添加 Iferror。它基本上是@Gary 的学生方法的数组公式实现。

编辑 2

这是翻译回 Excel 的 Google 表格公式。如果您不想使用 Offset,它为您提供了另一种选择:

=MAX(SUMIF(A2:A13,"<="&A2:A13,B2:B13)-INDEX(SUMIF(A2:A13,"<="&A2:A13,B2:B13),N(IF({1},MATCH(A2:A13,IF(B2:B13=0,A2:A13)))))) 

(作为数组公式输入)。

评论

也许真正的挑战是找到一个适用于 Excel 和 Google 表格的公式,因为:

  • Vlookup 在 Excel 中的工作方式不同
  • 偏移量/小计组合在 Google 表格中不起作用
  • 带有 n(if{1}... 的索引/匹配组合在 Google 表格中不起作用。
于 2020-04-21T14:18:23.597 回答
1

使用AB列中的数据,确保B列以 0 结尾。然后在C2中输入:

=IF(AND(B3=0,B2<>0),SUM(B$1:$B2)-MAX($C$1:C1),"")

并向下复制:

在此处输入图像描述

C列列出了连续非零的总和。在另一个单元格中输入如下内容:

=MAX(C:C)>19

其中19是标准值。

您可以通过使用 VBA UDF 来避免“助手”列。

编辑#1:

改用这个:

=IF(AND(B3=0,B2<>0),SUM(B$1:$B2)-SUM($C$1:C1),"")
于 2020-04-21T11:36:27.003 回答
0

感谢@Tom Sharpe 和@Gary 的学生回答了这个问题。

虽然我承认没有在问题中指定这一点,但我更愿意在没有帮助列的情况下实现解决方案,因为我必须在 30 多个连续列上执行此操作。我只是认为这在 Excel 中是不可能的。

完全归功于 Excelforum 上的用户 XOR LX 提出了这个解决方案。它让我大吃一惊,花了我一个小时的大部分时间来解决我的问题,但它确实非常有创意。我不可能自己想出它。在这里重新发布它是为了让所有正在研究这个问题的人受益。

将我最初问题中的表格复制并粘贴到一个空的 Excel 工作表中,使标题出现在 中(A1:B1),值出现在(A2:B13).

然后将此公式作为数组公式输入(ctrl+shift+enter),它给出所有不间断子数组之和的最大值:

=MAX(SUBTOTAL(9,OFFSET(B2,A2:A14,,-FREQUENCY(IF(B2:B13,A2:A13),IF(B3:B14=0,A2:A13,0))-1)))

请注意故意偏移以在数据集末尾下方增加一行。

于 2020-04-22T04:25:44.183 回答