问题描述
这个问题就像普通的计数反演问题一样,只是输入不再是一个单数列表,而是一个(x,y)对列表。
对于[[x1,y1),(x2,y2),(x3,y3),...,(xn,yn)]对的列表,对(i,j)是iff { {1}}和i < j
,xi>xj
。是否可以用O(n logn logn)编写算法?我尝试了几种方法,但是在合并步骤中,列表右半部分的每个元素都必须与左半部分的所有元素进行比较,导致时间复杂度为n平方。
解决方法
基于left
坐标将列表分为两部分right
和x
。然后,比较两半的最低点(基于它们的y
坐标)。有两种情况:
- 左边的点低于右边的点,那么左边的右边的所有点都有
xi<xj
和yi<yj
。 - 右边的点低于左边,因此
yi>yj
条件对于左边的任何点都成立。
根据这两种情况更新答案后,您可以删除这两点之一,然后继续处理剩余的排序列表(也可以递归求解left
和right
)。这应该在O(nlog^2n)
中起作用