Algorithm 求其和可被3整除的最长序列长度

Algorithm 求其和可被3整除的最长序列长度,algorithm,math,recursion,time-complexity,Algorithm,Math,Recursion,Time Complexity,我有一个练习需要用O(n)时间复杂度来完成,但是,我只能用O(n^2)解来解决它 你有一个数组,你需要计算最长的连续序列,这样它的和可以被除为3而没有余数。例如,对于数组{1,2,3,-4,-1),函数将返回4,因为它的和(0)可以划分为3的最长序列是{2,3,-4,-1} 我的解决方案O(n^2)是基于算术级数的。有没有办法解决O(n)的复杂性 请,我只想要一个线索或理论解释。请不要写完整的解决方案:)让我们看看前缀和。a[L,R]子数组可以被3整除,当且仅当prefixSum[L-1]mod

我有一个练习需要用O(n)时间复杂度来完成,但是,我只能用O(n^2)解来解决它

你有一个数组,你需要计算最长的连续序列,这样它的和可以被除为3而没有余数。例如,对于
数组{1,2,3,-4,-1)
,函数将返回4,因为它的
和(0)
可以划分为
3
的最长序列是
{2,3,-4,-1}

我的解决方案O(n^2)是基于算术级数的。有没有办法解决O(n)的复杂性


请,我只想要一个线索或理论解释。请不要写完整的解决方案:)

让我们看看前缀和。a
[L,R]
子数组可以被3整除,当且仅当
prefixSum[L-1]mod 3=prefixSum[R]mod 3
。这个观察给出了一个非常简单的线性解(因为前缀和mod 3只有3个可能的值,我们可以简单地找到第一个和最后一个)


例如,如果输入数组为{1,2,3,-4,-1},则前缀和为{0,1,0,0,2,1}。(由于前缀为空,因此有n+1个前缀和)现在你可以看看0,1和2的第一次和最后一次出现。

作为一个非CS的人,这很有趣。我的第一个方法是简单地计算运行总和mod 3。你会得到一个序列{0,1,2}.现在查找第一个和最后一个0、第一个和最后一个1以及第一个和最后一个2,并比较它们各自的距离…

您将应用动态规划。 对于每个位置,计算3个值:

  • 结束于总和s=0 mod 3位置的最长序列
  • 结束于总和s=1 mod 3位置的最长序列
  • 结束于总和s=2 mod 3位置的最长序列

因此,给定位置i的这个值,你可以很容易地计算位置i+1的新值。

在数组中迭代,边走边求和。记录第一个位置的位置,其中模和为
0
。此外,记录第一个位置的位置,其中模和为
1
。最后,记录p模和为
2
的第一个位置的位置


同样的事情也要向后做,记录模和为
0
1
2
的最后一个位置。这就给出了三种可能的最长序列-你只需检查哪一对相距最远。

你能给我一个带值数组的例子吗?如果我理解正确,我需要找到(第一个零->最后一个零),(第一个1->最后一个1),(第一个2->最后一个2)和最后一个零之间的最大值。那么,如果
prefixSum[L-1]mod 3=prefixSum[R]mod 3
?@haccks sum[L,R]mod 3=0(prefixSum[R]-prefixSum[L-1])mod 3=0 prefixSum[R]mod 3=prefixSum[L-1],那么你是如何得出结论的mod 3.@haccks如果L=0(在基于0的索引中),那么我们需要L-1的值。它在数组的边界之外,即使范围[0,something]是有效的。这就是为什么需要添加一个空前缀(以避免单独处理此情况)。这只是说prefixSum[-1]的一种方便方式=0。但是如果你为每个位置计算这3个值,你需要用两个循环来计算,不是吗?而且O(n^2)时间复杂度否。你可以为每个位置在固定时间内更新这3个值。解决方案的时间平面度为6N?