【问题标题】:Longest Consecutive Subsequence in a stream of integers整数流中的最长连续子序列
【发布时间】:2022-02-11 16:09:15
【问题描述】:

给定一个数组流,对于每个元素,我们必须找到迄今为止最长的连续子序列

例如:

10 -> 1

12 -> 1

11 -> 3 (10,11,12)

20 -> 3

我的想法:创建一个集合,并为每个传入号码检查它是否是 LCS 的开始/结束。取最大可能的长度。

既然是 O(N^2),有没有办法降低 TC?我不需要代码,只是一种优化算法的方法

【问题讨论】:

  • @MrSmith42 不,所有整数都是可能的
  • 如果您将每个传入号码 x 视为一个区间 [x, x+1],您可以使用数据结构来存储最大不相交区间,如 in this post. 所解释的那样,他们推荐使用区间树,它使用平衡BST 在每次操作的O(log n) 时间内解决此问题。您只需要存储最大间隔长度即可。
  • 11 -> 3 (10,11,12) ,不应该是 10,12,11 吗?我完全不明白这个例子
  • 顺序无所谓

标签: algorithm set


【解决方案1】:

您可以使用this post 的想法在O(n log n) 时间内使用平衡的BST 完成此操作。

传入号码x 将被视为间隔[x, x+1]。 BST 存储不相交区间的边界点; BST 中的每个叶节点还应该存储它是开始还是结束,以及它所属的间隔长度。

当一个点 x 进来时,在 BST 中搜索最大的元素 u <= x。如果它存在并且是“起点”,请继续。同时搜索最小元素x + 1 <= v。如果它存在并且是“终点”,请继续。

否则,有几种情况。如果x 是终点,x+1 是起点,则应从 BST 中删除两者,形成一个新区间,其大小为两个组合区间之和 + 1。如果 (x 之一是一个终点,x+1 是一个起点)为真,删除该点,并将适当的间隔分别向右或向左扩展 1。如果[x, x+1] 已包含在间隔中,请继续。否则,将 xx+1 添加到 BST 中,分别作为大小为 1 的开始和结束。

在每次添加时,您将检查新的间隔是否大于之前的最大间隔:如果是,并且u, v 是边界点,那么您最长的连续子序列是u, u+1, ... v-1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 2021-06-23
    • 1970-01-01
    • 2016-02-23
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多