解决 O(n) 中没有重复的原始问题的算法。也许,它可以帮助某人开发处理重复的 O(n) 解决方案。
输入:[a1, a2, a3, ...]
将原始数组映射为对,其中第一个元素是一个值,第二个元素是数组的索引。
数组:[[a1, i1], [a2, i2], [a3, i3], ...]
使用一些 O(n) 算法(例如计数排序)对这个对数组进行排序,以便按值进行整数排序。我们得到另一个数组:
数组:[[a3, i3], [a2, i2], [a1, i1], ...]
其中 a3, a2, a1, ... 按排序顺序排列。
通过对的排序数组运行循环
在线性时间内,我们可以检测到连续的数字组 a3、a2、a1。连续的组定义是下一个值 = 上一个值 + 1。在该扫描期间,保持当前组大小 ( n )、索引的最小值 ( min ) 和索引的当前总和 ( actualSum )。
在连续组内的每个步骤上,我们可以估计索引的总和,因为它们创建了具有第一个元素min、 step 1和到目前为止看到的组大小n的算术级数。这个总和估计可以使用算术级数公式在 O(1) 时间内完成:
估计总和 = (a1 + an) * n / 2;
估计总和 = (min + min + (n - 1)) * n / 2;
估计总和 = min * n + n * (n - 1) / 2;
如果在连续组内的某个循环步骤上估计总和等于实际总和,则到目前为止看到的连续组满足条件。将n保存为当前最大值结果,或在当前最大值和n之间选择最大值。
如果在值元素上我们不再看到连续组,则重置所有值并执行相同操作。
代码示例:https ://gist.github.com/mishadoff/5371821