有一个长度为n的数组,值为 a[i], 牛牛想找到数组中第 k 小的数。比如 1 2 2 3 4 6 中,第 3 小的数就是2. 牛牛觉得这个游戏太简单了,想加一点难度,现在牛牛有 m 个操作,每个操作有两种类型。 1 x 1 代表操作一,给数组中加一个元素 x 。(0 ≤ x ≤ 1e9) 2 2 代表操作二,查询第 k 小的数。如果没有 k 个数就输出−1 第一行有三个整数,n m k,(1≤n,m,k≤2e5) 第二行包含 n 个整数 a[i] ( 0 ≤ a[i] ≤ 1e9) 接下来m行,每行代表一个操作 每次查询输出一个第 k 小的数
时间: 2024-04-13 14:30:09 浏览: 105
输入n个整数,输出其中最小的k个
这个问题可以通过使用堆数据结构来解决。我们可以使用一个最小堆来存储数组中的元素,并且在每次查询时,从堆中弹出前k个最小的数,最后返回第k个弹出的数。
首先,我们需要将数组中的元素插入到最小堆中。然后,对于每个操作,如果是操作一,我们将新元素插入到最小堆中;如果是操作二,我们弹出前k个最小的数,并返回第k个弹出的数。
下面是一个示例代码实现:
```python
import heapq
def find_kth_smallest(nums, k):
heap = []
for num in nums:
heapq.heappush(heap, num)
kth_smallest = -1
for _ in range(k):
if heap:
kth_smallest = heapq.heappop(heap)
return kth_smallest
def main():
n, m, k = map(int, input().split())
nums = list(map(int, input().split()))
for _ in range(m):
operation = list(map(int, input().split()))
if operation[0] == 1:
heapq.heappush(nums, operation[1])
elif operation[0] == 2:
kth_smallest = find_kth_smallest(nums, k)
print(kth_smallest)
if __name__ == "__main__":
main()
```
注意,这个实现将数组nums作为最小堆来处理,而不是单独创建一个堆。这是因为Python的heapq模块提供了在列表上进行堆操作的函数,从而避免了创建额外的堆数据结构。
阅读全文