LeetCode(剑指 Offer)- 41. 数据流中的中位数
Posted 放羊的牧码
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode(剑指 Offer)- 41. 数据流中的中位数相关的知识,希望对你有一定的参考价值。
题目链接:点击打开链接
题目大意:略
解题思路
相关企业
- 字节跳动
- 亚马逊(Amazon)
- 微软(Microsoft)
- 苹果(Apple)
- 谷歌(Google)
- Indeed
- 领英(LinkedIn)
- 优步(Uber)
- 英伟达(NVIDIA)
AC 代码
- Java
// 解决方案(1)
class MedianFinder
int[] data;
int len;
/** initialize your data structure here. */
public MedianFinder()
data = new int[100000];
len = 0;
public void addNum(int num)
if (len == 0)
data[len++] = num;
return;
int idx = search(num);
len++;
for (int i = len - 1; i > idx; i--)
data[i] = data[i - 1];
data[idx] = num;
public double findMedian()
if (len % 2 == 0)
return (data[len / 2 - 1] + data[len / 2]) / 2.0;
else
return data[len / 2];
private int search(int val)
int l = 0, r = len - 1;
while (l <= r)
int mid = (l + r) / 2;
if (data[mid] == val)
return mid;
else if (data[mid] < val)
l = mid + 1;
if (l > r)
return l;
else
r = mid - 1;
if (r < l)
return r + 1; // 当 l == r 时, 此时这个场景应该取 r + 1 自己举个例子就知道了
return -1;
// 解决方案(2)
class MedianFinder
Queue<Integer> A, B;
public MedianFinder()
A = new PriorityQueue<>(); // 小顶堆,保存较大的一半
B = new PriorityQueue<>((x, y) -> (y - x)); // 大顶堆,保存较小的一半
public void addNum(int num)
if(A.size() != B.size())
A.add(num);
B.add(A.poll());
else
B.add(num);
A.add(B.poll());
public double findMedian()
return A.size() != B.size() ? A.peek() : (A.peek() + B.peek()) / 2.0;
- C++
class MedianFinder
public:
priority_queue<int, vector<int>, greater<int>> A; // 小顶堆,保存较大的一半
priority_queue<int, vector<int>, less<int>> B; // 大顶堆,保存较小的一半
MedianFinder()
void addNum(int num)
if(A.size() != B.size())
A.push(num);
B.push(A.top());
A.pop();
else
B.push(num);
A.push(B.top());
B.pop();
double findMedian()
return A.size() != B.size() ? A.top() : (A.top() + B.top()) / 2.0;
;
以上是关于LeetCode(剑指 Offer)- 41. 数据流中的中位数的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode1269. 停在原地的方案数 / 剑指 Offer 38. 字符串的排列 / 216. 组合总和 III / 剑指 Offer 39. 数组中出现次数超过一半的数字/229. 求众数(
LeetCode692. 前K个高频单词 / 剑指 Offer 50. 第一个只出现一次的字符 / 剑指 Offer 51. 数组中的逆序对 / 2. 两数相加