第 K 个最小的对和小于给定对 (x, y) 的对数
给定N对,任务是找到第K个最小的对和小于给定对(x, y)的对数。
例子:
Input: pairs[][] = {{23, 20}, {23, 10}, {23, 30}, {12, 35}, {12, 22}}, K = 3, (x, y) = (23, 20)
Output:
{23, 10}
3
Input: pairs[][] = {{23, 20}, {23, 10}, {23, 30}, {12, 35}, {12, 22}}, K = 2, (x, y) = (12, 35)
Output:
{12, 35}
1
朴素方法:上述问题可以通过从数组中找到所有对,然后分别打印第 K 个最小的对和小于 (x, y) 的对数来解决。
基于策略的数据结构方法:以下是将基于策略的数据结构显示为 MAP 的代码。它可以添加/删除元素对,可以在 O(log N) 时间内找到小于 (x, y) 的对数、第 K 个最小的对等。这个映射的特点是我们可以访问这对元素在一个排序的二维数组中的索引。如果该对未出现在地图中,我们将获得该对在地图中的位置。
// C++ implementation of the approach
#include
#include
#include
#include
using namespace __gnu_pbds;
using namespace std;
// A new data structure is defined
// Please refer https:// goo.gl/WVDL6g
typedef tree, null_type,
less >,
rb_tree_tag, tree_order_statistics_node_update>
ordered_map;
// Driver code
int main()
{
ordered_map om;
om.insert({ 23, 20 });
om.insert({ 23, 10 });
om.insert({ 23, 30 });
om.insert({ 12, 35 });
om.insert({ 12, 22 });
int K = 2, x = 12, y = 35;
cout << "{" << om.find_by_order(K - 1)->first << ", "
<< om.find_by_order(K - 1)->second << "}\n";
cout << om.order_of_key({ x, y }) << endl;
return 0;
}
输出:
{12, 35}
1