如何解决查找范围内元素的高效查询
我面临一个问题,我需要找到一个特定的成对和,其中索引中的第一个元素的索引 > i
。
示例:
[1,2,3,4,6]
(索引 0
到 4
)
target_sum = 9
现在,我需要从这个数组中找到一个成对和,其中索引中的第一个元素的索引 > i
。
现在,显而易见的解决方案是:
- 计算成对和数组。
[1+2,1+3,1+4,1+6,2+3,2+4,2+6,3+4,3+6,4+6]
[ O(n^2) ]i> - 遍历索引
i+1
到n
以找到 target_sum。 [ O(n^2) ] (n为原始数组的长度)
现在,主要问题是2。即使我不能改进(1),我也需要改进(2),因为这会被很多人问到。
我想到的一种方法:
- 从成对和数组中创建一个索引、值对数组。 O(n^2) [n 为原始长度]
- 先用值对数组排序,然后用索引排序。 O(n^2 * logn)
- 对于每个查询,运行二进制搜索以找到值存在的区间。 O(logn)
- 在该时间间隔上运行另一个二分搜索以找到索引 >
i
。
有什么优雅更好的方法吗?
解决方法
在 sum -> highest first element index
中创建地图 O(n^2)
。然后通过在地图中查找目标总和并确定 O(1)
是否高于 highest first element index
来回答 i
中的每个查询。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。