微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

查找范围内元素的高效查询

如何解决查找范围内元素的高效查询

我面临一个问题,我需要找到一个特定的成对和,其中索引中的第一个元素的索引 > i

示例:

[1,2,3,4,6](索引 04

target_sum = 9

现在,我需要从这个数组中找到一个成对和,其中索引中的第一个元素的索引 > i

现在,显而易见的解决方案是:

  1. 计算成对和数组。 [1+2,1+3,1+4,1+6,2+3,2+4,2+6,3+4,3+6,4+6] [ O(n^2) ]​​i>
  2. 遍历索引 i+1n 以找到 target_sum。 [ O(n^2) ] (n为原始数组的长度)

现在,主要问题是2。即使我不能改进(1),我也需要改进(2),因为这会被很多人问到。

我想到的一种方法

  1. 从成对和数组中创建一个索引、值对数组。 O(n^2) [n 为原始长度]
  2. 先用值对数组排序,然后用索引排序。 O(n^2 * logn)
  3. 对于每个查询,运行二进制搜索以找到值存在的区间。 O(logn)
  4. 在该时间间隔上运行另一个二分搜索以找到索引 > i

有什么优雅更好的方法吗?

解决方法

sum -> highest first element index 中创建地图 O(n^2)。然后通过在地图中查找目标总和并确定 O(1) 是否高于 highest first element index 来回答 i 中的每个查询。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?