首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >第一元素之间的差小于或等于第二元素中的最小值的对的数量

第一元素之间的差小于或等于第二元素中的最小值的对的数量
EN

Stack Overflow用户
提问于 2018-01-29 23:43:05
回答 3查看 149关注 0票数 0

给定整数对pair<int,int>的阵列,需要找出pair<>对的数目,使得对的第一元素之间的绝对差小于或等于对的第二元素的最小值。

例如:

代码语言:javascript
运行
复制
Pair 1: 2,5
Pair 2: 7,4
Since (7-2) <= min(5,4) it is a valid pair

PS:我期待着比朴素的O(N*N)更好的时间复杂度。

EN

Stack Overflow用户

发布于 2018-01-30 00:34:36

让我们按照第二个值以非递增的顺序对我们的对进行排序。然后按此顺序遍历这些对。假设当前对具有索引i,并查看所有对(j, i),其中为j < i。我们知道这些对中的第二个元素的最小值是pairs[i].second (因为它的顺序不是递增的)。然后我们需要找出索引的数量j,其中

代码语言:javascript
运行
复制
 |pairs[j].first - pairs[i].first| <= pairs[i].second

让我们重新制定:我们需要找出索引为j < i的对的第一个元素的数量,它们位于区间内:

代码语言:javascript
运行
复制
[pairs[i].first - pairs[i].second, pairs[i].first + pairs[i].second]

例如,可以使用O(log(n))中的augmented self-balancing BST (我们可以保留和更新每个顶点中的子代数量)来实现这一点。伪码:

代码语言:javascript
运行
复制
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 treeSegment tree替换BST。

票数 2
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48504951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档