遇到数组的题,实在没思路就先想着排序下,排完序可能就有思路了。对于挑选第几个数的题目一定要想到堆也就是priority_queue
。
215. 数组中的第K个最大元素
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例 1:
1
2
3 > 输入: [3,2,1,5,6,4] 和 k = 2
> 输出: 5
>
示例 2:
1
2
3 > 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
> 输出: 4
>
堆解
维护一个k
个元素大小的小顶堆,当元素超过k个pop
掉,因为是小顶堆顶端元素是最小的,最后只有最大的k个元素被保存下来了,恰巧我们要求第K大的数,直接取top()
就行。下图是示例1在小顶堆中的变化状态。
1 | class Solution { |
快速选择
这个方法和快速排序
思路是一致的将数组划分成两部分,只用到一边去找元素就行,不过这里要注意个问题就是,当left
和right
在发生相遇之后会交错,在处理边界条件的时候需要特别注意。
1 | class Solution { |