给定整数对pair<int,int>的阵列,需要找出pair<>对的数目,使得对的第一元素之间的绝对差小于或等于对的第二元素的最小值。
例如:
Pair 1: 2,5
Pair 2: 7,4
Since (7-2) <= min(5,4) it is a valid pairPS:我期待着比朴素的O(N*N)更好的时间复杂度。
发布于 2018-01-30 00:34:36
让我们按照第二个值以非递增的顺序对我们的对进行排序。然后按此顺序遍历这些对。假设当前对具有索引i,并查看所有对(j, i),其中为j < i。我们知道这些对中的第二个元素的最小值是pairs[i].second (因为它的顺序不是递增的)。然后我们需要找出索引的数量j,其中
 |pairs[j].first - pairs[i].first| <= pairs[i].second让我们重新制定:我们需要找出索引为j < i的对的第一个元素的数量,它们位于区间内:
[pairs[i].first - pairs[i].second, pairs[i].first + pairs[i].second]例如,可以使用O(log(n))中的augmented self-balancing BST (我们可以保留和更新每个顶点中的子代数量)来实现这一点。伪码:
res = 0
sort pairs by second value in non-increasing order
for i = 1 to n
    res += number of elements in BST on interval [pairs[i].first - pairs[i].second, pairs[i].first + pairs[i].second]
    add pairs[i].first to BST   总体复杂度将是O(n*log(n))。
如果对中的整数值为O(n),则可以使用Fenwick tree或Segment tree替换BST。
https://stackoverflow.com/questions/48504951
复制相似问题