最大产品子序列

She*_*ano 7 algorithm

我需要按n整数序列找到子序列的最大乘积.我正在寻找一种算法,不一定表示为代码.

例:

  1. 在:3,1,-2,4.出:4.
  2. 在:2,5,-1,-2,-4.出:20.(2*5*-1*-2).

我已经完成了算法O(n²),但现在我需要一个算法O(n).
我知道这是可能的.

怎么办O(n)呢?

chu*_*ica 5

如果您的所有输入都是> 0,则可以通过将所有数字相乘来找到最大乘积.

如果您的所有输入都是非0且具有偶数的负数,则再次通过将所有数字相乘来找到最大乘积.

因此,工作是处理零和负数.

您需要通过列表一次,随时计算正在运行的产品.如果你达到0,那么之前的所有内容都是一个候选子集,如果它比迄今为止发现的最好,那么需要保存其详细信息(起始索引,结束索引,产品).现在开始一个新的运行产品.如果您达到负数,则该项是您的总计中的条件中断.不使用负数的运行产品将被评估为最佳状态.但是现在你需要有2个正在运行的产品,一个是负数而另一个是新产品.因此,后续的乘法需要对2个列表起作用.此时我将有2个正在运行的产品.如果你打另一个负数,你的每个运行列表都需要按照前面的描述进行二分.如果你不修剪,你可能会得到很多运行列表.我认为你可以修剪运行列表只跟踪3:刚启动的子列表,带有奇数负数的连续列表和偶数奇数的负数.任何候选子列表都不是正在进行的乘法的一部分,应该在放弃之前评估它是否是最好的.

最后它的O(n)