【问题标题】:Longest sub-sequence the elements of which make up a set of increasing integers元素组成一组递增整数的最长子序列
【发布时间】:2017-04-14 13:21:28
【问题描述】:

找出数组的最长连续子序列的长度,该数组的元素组成一组连续递增的整数。 输入文件由数字n(数组中元素的数量)和n整数组成。
示例输入 - 10 1 6 4 5 2 3 8 10 7 7
示例输出 - 6(1 6 4 5 2 3,因为它们构成了集合 1 2 3 4 5 6)。
我能够编写满足 0<n<5000 的算法,但为了获得 100 分,该算法必须适用于 0<=n<=50000

【问题讨论】:

  • 也许如果你发布一些代码来展示你已经尝试过的东西,人们可能会留下这个问题。 (虽然,由于您要求更有效的算法,我不是您在技术上可以提供的比您已经拥有的更多...)

标签: c++ arrays algorithm


【解决方案1】:

这样的事情怎么样?按降序排列数组元素,每个元素与其索引范围结合为局部最大值(例如,A[0] = 10 将是数组索引的最大值,[0, 10],而A[3] = 4 将是数组索引的局部最大值, [3,3]。现在遍历这个列表,找到最长的、连续降序的序列,其中索引范围都包含在起始范围内。

10 1 6 4 5 2 3 8 10 7 7
=> 10, [ 0,10]
    8, [ 1, 7]
    7, [ 9,10]
    6, [ 1, 6] <--
    5, [ 3, 6]    | ranges
    4, [ 3, 3]    | all
    3, [ 5, 6]    | contained
    2, [ 5, 5]    | in [1,6]
    1, [ 1, 1] <--

【讨论】:

  • 嗯,确实是一个非常好的解决方案,但重复元素确实会损害算法。例如,如果在 5 之后又是 5,那么算法就会变得非常模糊。或者在更糟糕的情况下,如果数组是这样的 - 1 5 4 2 3 7 1 5 4 2 3 怎么办?
  • @DavidAsryan 感谢您的评论。将每组重复项排列在按起始索引排序的数组中。任何作为学期延续候选的重复项是(1)该学期之后的下一个较小的数字和(2)由于是下一个较低的数字,必须共享相同的开始和结束(如果它们在同一侧他们的下一个更高的术语)或具有相互排斥的索引范围作为局部最大值(例如,在您的示例中,5 作为 7 的候选者,1 5 4 2 3 7 1 5 4 2 3)。
  • @DavidAsryan 你也可以澄清一下这样的解决方案是什么:1 1 2 2 3 3 4 4
  • 由于问题只需要子序列的长度,因此它将是两个
  • 不要看起来很愚蠢,但我还是不明白我应该如何处理重复。你能再澄清一点吗?
猜你喜欢
  • 2018-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多