我面临一个问题,我需要找到一个特定的成对和,其中索引中的第一个元素具有索引>CCD_ 1。
示例:
[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+1
到n
以查找target_sum。[O(n^2(](n为原始数组的长度(
现在,主要问题是2。即使我不能改进(1(,我也需要改进(2(,因为这会受到很多质疑。
我想到的一种方法是:
- 从成对和数组中生成一个索引、值对数组。O(n^2([n为原始长度]
- 先按值对数组进行排序,然后按索引进行排序。O(n^2*logn(
- 对于每个查询,运行二进制搜索以查找值所在的间隔。O(logn(
- 在该间隔上运行另一个二进制搜索以查找索引>
i
有什么优雅更好的方法吗?
在i
1中创建映射sum -> highest first element index
。然后通过在映射中查找目标和并确定highest first element index
是否高于i
来回答O(1)
中的每个查询。