计算分裂点的数量

时间:2015-02-19 18:12:23

标签: algorithm split

我刚才有一个关于计算整数数组中分裂点的问题,以确保双方至少有一个重复的整数。

例如:

1 1 4 2 4 2 4 1

我们可以将其拆分为:

1 1 4 2 | 4 2 4 1

1 1 4 2 4 | 2 4 1

这样两边至少有一个'1','2'和'4'。

整数范围为1到100,000

复杂性需要O(n)。如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

对数组进行一次传递并构建count[i] = how many times the value i appears in the array。如果count[i] >= 2表示所有非零值,则问题仅可解决。您可以使用此数组来判断数组中有多少个不同的值。

接下来,再次传递并使用另一个数组count2[i](或者您可以重复使用第一个数组),跟踪您至少访问过一次每个值的时间。然后使用该位置作为分割点。

示例:

1 1 4 2 4 2 4 1
count = [3, 2, 0, 4] => 3 distinct values

1 1 4 2 4 2 4 1
^ => 1 distinct value so far
  ^ => 1 distinct value so far
    ^ => 2 distinct values so far
      ^ => 3 distinct values so far => this is your split point

可能存在没有解决方案的情况,例如,如果最后的1也在开头。要检测到这一点,您可以在确定分割点后再对其余的数组进行另一次传递,看看是否仍然拥有该方的所有值。

您可以使用countcount2数组来检测何时无法再进行拆分,从而避免此次最后一次传递。这是一个练习。