描述
给定一个未排序的整数数组,找到其中位数。中位数是升序排序后数组的中间值,如果数组的个数是偶数个,则返回排序后数组的第N/2
个数。
输入:
数组 = [4, 5, 1, 2, 3]
输出:
3
解释:
经过排序,得到数组[1,2,3,4,5],中间数字为3
样例 2:
输入:
数组 = [7, 9, 4, 5]
输出:
5
知识点总结:
1,top(),获取栈或列表的顶部元素
2,pop(),用于移除列表或者其他可迭代对象的最后一个元素
3,priority_queue<int> que;
定义一个名为que的priority_queue---》最大堆,队列顶部的元素是所有元素的最大值
题解:
使用优先队列维护大小为k的有序集合,优先队列大小小于k时直接压入,等于k时与首个元素判断大小关系,小于时直接压入,并将首个元素弹出。最后输出优先队列的头部元素即可。
优先队列:
- 优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出的行为特征。通常采用堆数据结构来实现。
- 默认情况下,优先队列按照非递增顺序排列。
代码实现:
class Solution {
2public:
3 /**
4 * @param nums: A list of integers.
5 * @return: An integer denotes the middle number of the array.
6 */
7 int median(vector<int> &nums) {
8 // write your code here
9 int k = (nums.size() + 1) / 2;
10 priority_queue<int> que;
11 int len = nums.size();
12 for(int i = 0; i < len; i ++) {
13 if(que.size() == k) {
14 if(nums[i] < que.top()) {
15 que.pop();
16 que.push(nums[i]);
17 }
18 }else {
19 que.push(nums[i]);
20 }
21 }
22 return que.top();
23 }
24};