第k个很棒

时间:2015-03-19 15:13:10

标签: c++ data-structures

我可以使用哪种数据结构来解决此问题:

如果输入包含:

  • +1 - 插入值为Ki
  • 的元素
  • 0 - 查找并打印第K个最大元素
  • -1 - 删除值为Ki
  • 的元素

示例输入:

8
+1 5
+1 3
+1 7
0 2
-1 3
0 1
+1 10
0 3

输出:

5
7
5

2 个答案:

答案 0 :(得分:-1)

数据结构:自平衡BST (例如红黑树)

c ++中的容器:设置

时间复杂性:

  • 插入:O(log(n))
  • 删除:O(log(n))
  • K阶统计:O(n)

答案 1 :(得分:-1)

我会使用某种形式的二叉搜索树: std::set可通过按键访问,看起来非常适合您的需求。 std::map是一个关联容器,通常实现为红黑树。

在你的情况下,我会选择std::set

//getting the n-th element in set
auto it = std::next(myset.begin(), n);

为了完整起见,我还应该提一下std :: vector + std :: sort,它在算法上效果较差,但是如果你没有庞大的数据集,由于数据局部性(包含矢量),它会更高效。在预分配的内存块中以顺序方式对象。)