【问题标题】:Find the next index and last index for a particular index in an array?查找数组中特定索引的下一个索引和最后一个索引?
【发布时间】:2021-06-07 16:56:27
【问题描述】:

在数组中找到等于特定元素的下一个索引和数组中也等于特定元素的前一个索引?

让我们举个例子:给定数组是(数组将只包含元素 5,0 和 6)

5 0 5 5 0 0 5 0 0 0 0 0 6 6 6 0 0 6 0 6 5 5 0

如果我们采用任何索引,例如 8,其中包含零。对于该索引,下一个元素 6 位于索引 12,最后一个元素 5 位于索引 6。类似地,让我们采用索引 2。对于该索引,下一个元素 6 位于索引 12 处,最后一个元素 5 位于索引 2 处。


我的方法:

  1. 我使用了 countfives 数组,它存储 5 的索引,countsixes 存储 6 的索引。它的使用方式是,如果任何索引包含 5,则 countfives 存储它,如果下一个索引存储零,则 countfives[i] =计数[i-1]。对我最后 5 个和下一个 6 的每个索引都使用它。

  2. 我使用二分查找查找下一个 6 和最后一个 5 的索引。


有什么方法可以更优化地做到这一点?

【问题讨论】:

    标签: arrays binary-search


    【解决方案1】:

    查看您建议的解决方案:

    1. 这绝对是O(1) 上最快的查找时间,因为您实际上有一个包含答案的完整表格。但是,它会占用大量内存,并且由于必须修改三个不同的数组,因此插入时间可能会很慢。

    2. 我认为这不会起作用,因为二进制搜索仅适用于已排序的数组,而您的数组未排序。但是,您可能是在建议我在下面建议的第二种解决方案。

    几个潜在的其他解决方案:

    1. 最简单的解决方案:Worst-case O(n) 从起始索引向前和向后迭代,直到找到所需的数字。如果有 5 和 6 接近所选索引,这可能会非常快,因为我们必须检查的实际索引数量只是目标与起点的距离。大多数情况下,这可能是最实用的选择。

    2. 使用所有五和六的索引创建一个排序数组(因为它们是索引,它们已经按顺序排列了)。所以,fives = [0, 2, 3, 6, 20, 21]sixes = [12, 13, 14, 17, 18]。然后,我们可以对每个数组进行O(logn) 修改后的二进制搜索,以找到大于/小于原始索引的第一个索引。虽然它确实比仅在原始阵列上操作需要更多的内存,但它会比您的第一个解决方案少得多。它没有O(1) 的时间,但O(logn) 仍然非常好,所以你必须做出权衡。

    最终,这实际上取决于您最看重查找时间、插入时间还是内存。

    【讨论】:

      猜你喜欢
      • 2010-11-06
      • 2013-09-14
      • 2013-02-14
      • 1970-01-01
      • 2019-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多