[剑指offer]面试题第[41]题[Leetcode][第235题][JAVA][数据流中的中位数][优先队列][堆]
【问题描述】[困难]
【解答思路】
1. 思路1
时间复杂度:O(logN) 空间复杂度:O(N)
import java.util.PriorityQueue;public class MedianFinder {/*** 当前大顶堆和小顶堆的元素个数之和*/private int count;private PriorityQueue<Integer> maxheap;private PriorityQueue<Integer> minheap;/*** initialize your data structure here.*/public MedianFinder() {count = 0;//maxHeap = new PriorityQueue<>(Collections.reverseOrder());maxheap = new PriorityQueue<>((x, y) -> y - x);minheap = new PriorityQueue<>();}public void addNum(int num) {count += 1;maxheap.offer(num);minheap.add(maxheap.poll());// 如果两个堆合起来的元素个数是奇数,小顶堆要拿出堆顶元素给大顶堆if ((count & 1) != 0) {maxheap.add(minheap.poll());}/*//如果不平衡则调整 不用countif (minHeap.size() > maxHeap.size()) {maxHeap.offer(minHeap.poll());}*/}public double findMedian() {if ((count & 1) == 0) {// 如果两个堆合起来的元素个数是偶数,数据流的中位数就是各自堆顶元素的平均值return (double) (maxheap.peek() + minheap.peek()) / 2;} else {// 如果两个堆合起来的元素个数是奇数,数据流的中位数大顶堆的堆顶元素return (double) maxheap.peek();}
//不用count
public double findMedian() {if (maxHeap.size() == minHeap.size()) {return (maxHeap.peek() + minHeap.peek()) * 0.5;}return maxHeap.peek();}}
}
2. 思路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;}
}
【总结】
1.最大堆/最小堆初始化
最小堆
PriorityQueue minheap = new PriorityQueue<>();
最大堆
PriorityQueue maxheap = new PriorityQueue<>((x, y) -> y - x);
PriorityQueue maxHeap = new PriorityQueue<>(Collections.reverseOrder());
2.找规律 模拟过程 不可能是一蹴而就 而是多次失败后才能找到的规律和转移过程
转载链接:https://leetcode-cn.com/problems/find-median-from-data-stream/solution/you-xian-dui-lie-python-dai-ma-java-dai-ma-by-liwe/
参考链接:https://leetcode-cn.com/problems/shu-ju-liu-zhong-de-zhong-wei-shu-lcof/solution/you-xian-dui-lie-wu-fei-hua-jian-dan-yi-dong-by-je/
参考链接:https://leetcode-cn.com/problems/shu-ju-liu-zhong-de-zhong-wei-shu-lcof/solution/mian-shi-ti-41-shu-ju-liu-zhong-de-zhong-wei-shu-y/
[剑指offer]面试题第[41]题[Leetcode][第235题][JAVA][数据流中的中位数][优先队列][堆]相关推荐
- 剑指Offer:面试题33——把数组排成最小的数(java实现)(未完待续)
问题描述: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 思路1: ...
- [剑指offer]面试题第[68-2]题[Leetcode][第236题][JAVA][二叉搜索树的最近公共祖先][递归]
[问题描述][中等] 235/68-1 搜索二叉树 236/68-2 二叉树 [解答思路] 递归 时间复杂度:O(N) 空间复杂度:O(N) 情况 1. , 2. , 3. , 4. 的展开写法如下. ...
- [剑指offer]面试题第[57]题[Leetcode][第167题][JAVA][和为s的两个数字][两数之和][HashSet][二分][双指针]
[剑指offer]面试题第[57]题[Leetcode][第167题][第1题] 有序无序之分 题目输出不同之分 以下解法按照[剑指offer]面试题第[57]题进行题解 [问题描述][简单] 输入一 ...
- 剑指offer——面试题41:和为S的连续整数序列
剑指offer--面试题41:和为S的连续整数序列 Solution1:我的答案 基本思路是根据等差数列的前n项和推导出首项与项数的关系,设首项为a1a1a_1,项数为kkk,和为S" ro ...
- 算法题001 剑指Offer 面试题三:二维数组中的查找
剑指Offer题目1:二维数组中的查找 题目描述: http://ac.jobdu.com/problem.php?cid=1039&pid=0 在一个二维数组中,每一行都按照从左到右递增的顺 ...
- 【剑指Offer面试题】 九度OJ1510:替换空格
c/c++ 中的字符串以"\0"作为结尾符.这样每一个字符串都有一个额外字符的开销. 以下代码将造成内存越界. char str[10]; strcpy(str, "01 ...
- 剑指offer 面试题三 找出数组中重复的数字
1 import org.junit.Test; 2 3 import java.util.Arrays; 4 import java.util.HashSet; 5 6 public class D ...
- (待补充)【n个骰子的点数】剑指offer——面试题43:n个骰子的点数
剑指offer--面试题43:n个骰子的点数 [注意]此题再牛客网上没有OnlineJudge,在此补充解法. 题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为s.输入n,打印出s的所有可能的值 ...
- (补充)【打印1到最大的n位数】剑指offer——面试题12:打印1到最大的n位数
剑指offer--面试题12:打印1到最大的n位数 此题在牛客网上没有OnlineJudge,在此补充两种做法. 参考网址:https://blog.csdn.net/yanxiaolx/articl ...
最新文章
- Scala的异常处理
- Android 学习笔记 BroadcastReceiver广播...
- 053_Unicode字符官方标准四
- 高度平衡树 -- AVL 树
- “易+”开源 | 网易会议开源之移动端篇
- ServiceStack.Redis之IRedisClient第三篇
- Golang语言基础课件
- 同频切换的事件_LTE前台路测切换问题处理大礼包
- 爬虫的一些知识点 目录 1. 网络爬虫	1 2. 产生背景 垂直领域搜索引擎	2 3. 1 聚焦爬虫工作原理以及关键技术概述	3 4. 涉及技术	3 4.1. 下载网页 一般是通过net api
- 使用ffmpeg合并.h264文件
- jquery版本之间的冲突
- socket 服务器端和客户端通信,面向TCP的
- 公众号数据分析总结怎么做?教你玩转公众号后台数据
- JavaScript高级(二)
- Easyrecovery激活码生成器分享
- MATLAB求解一阶RC电路和二阶RLC电路
- github在线简历
- ERP 系统的应用对企业财务会计信息系统内部控制的影响
- Laravel -- 实战篇 自制二维码 Simple QrCode
- 【NLP】第8章 将 Transformer 应用于法律和财务文件以进行 AI 文本摘要