假设我有一个长度为a[]
的未排序整数数组N
。
现在我想找到给定间隔a[i]-a[j]
(1 <= i <= j <= N
)内的第k个最小整数。
例如:我有一个数组a[10]={10,15,3,8,17,11,9,25,38,29}
。
现在我想找到a[2]-a[7]
区间内的第3个最小元素。
答案是9。
我知道这可以通过排序该间隔来完成。但这需要花费O(Mlog(M))
(M = j - i + 1
)的时间。另外,我知道,这可以通过分段树完成,但我无法理解如何修改它来处理这样的查询。
答案 0 :(得分:0)
您可以使用Quickselect,Quicksort的修改来查找列表中的k th 最小/最大值。为了简单起见,我们假设您正在尝试为整个数组执行此操作(请注意,没有区别)。
基本上你使用quicksort,但只使用一个递归调用而不是两个。放置它的枢轴后,您只需要为其中一个分区调用快速排序,具体取决于枢轴的位置。这是O(N 2 ),但是O(N)的平均情况。如果你使用随机枢轴,它几乎总是O(N)。