经典困难难度算法题,利用优先队列其实很好解决

news/2024/10/17 16:31:09/

这道题在力扣官网上面是困难难度。但是假如利用好 C++ 的优先队列或者利用好大根堆和小根堆,​这道题的思路其实很简单。

题目描述:

题号:295

中位数是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。

  • 例如 arr = [2,3,4] 的中位数是 3 。

  • 例如 arr = [2,3] 的中位数是 (2 + 3) / 2 = 2.5 。

实现 MedianFinder 类:

  • MedianFinder() 初始化 MedianFinder 对象。

  • void addNum(int num) 将数据流中的整数 num 添加到数据结构中。

  • double findMedian() 返回到目前为止所有元素的中位数。与实际答案相差 10-5 以内的答案将被接受。

解题思路:

思路一:优先队列

初始化两个空堆:一个最大堆(maxHeap)和一个最小堆(minHeap)。

  1. 将新数字与maxHeap的堆顶(即较小一半的最大值)进行比较。

  2. 如果新数字小于等于maxHeap的堆顶,则将其添加到maxHeap中。此时,我们需要检查两个堆的大小关系,确保maxHeap的大小始终小于等于minHeap的大小,或相差1。如果maxHeap的大小超过了minHeap的大小加1,我们需要将maxHeap的堆顶元素移除,并添加到minHeap中。

  3. 否则,将新数字的负值添加到minHeap中。同样,我们需要检查两个堆的大小关系。如果minHeap的大小超过了maxHeap的大小,我们需要将minHeap的堆顶元素(取负后)移除,并添加到maxHeap中。

如果两个堆的大小不一样,则中位数为 maxHeap 的堆顶。

否则,中位数为 maxHeap 堆顶和 minHeap 堆顶的值相加除以 2。

时间复杂度:O(log N) 

空间复杂度:O(N)

C++

// C++
class MedianFinder {priority_queue<int> bigHeap;    // small part, extra onepriority_queue<int, vector<int>, greater<int>> smallHeap;   // big part
public:MedianFinder() {
​}void addNum(int num) {if(bigHeap.size() == smallHeap.size()) {smallHeap.push(num);bigHeap.push(smallHeap.top());smallHeap.pop();} else {bigHeap.push(num);smallHeap.push(bigHeap.top());bigHeap.pop();}}double findMedian() {if(bigHeap.size() == smallHeap.size()) {return (bigHeap.top() + smallHeap.top()) / 2.0;}return bigHeap.top();}
};
​
/*** Your MedianFinder object will be instantiated and called as such:* MedianFinder* obj = new MedianFinder();* obj->addNum(num);* double param_2 = obj->findMedian();*/

go

// go
// 定义一个最大堆  
type BigHeap []int  func (h BigHeap) Len() int           { return len(h) }  
func (h BigHeap) Less(i, j int) bool { return h[i] > h[j] }  
func (h BigHeap) Swap(i, j int)      { h[i], h[j] = h[j], h[i] }  func (h *BigHeap) Push(x interface{}) {  *h = append(*h, x.(int))  
}  func (h *BigHeap) Pop() interface{} {  old := *h  n := len(old)  x := old[n-1]  *h = old[0 : n-1]  return x  
}  // 定义一个最小堆  
type SmallHeap []int  func (h SmallHeap) Len() int           { return len(h) }  
func (h SmallHeap) Less(i, j int) bool { return h[i] < h[j] }  
func (h SmallHeap) Swap(i, j int)      { h[i], h[j] = h[j], h[i] }  func (h *SmallHeap) Push(x interface{}) {  *h = append(*h, x.(int))  
}  func (h *SmallHeap) Pop() interface{} {  old := *h  n := len(old)  x := old[n-1]  *h = old[0 : n-1]  return x  
}  type MedianFinder struct {  bigHeap   BigHeap  smallHeap SmallHeap  
}  func Constructor() MedianFinder {  return MedianFinder{  bigHeap:   make(BigHeap, 0),  smallHeap: make(SmallHeap, 0),  }  
}  func (this *MedianFinder) AddNum(num int) {  if len(this.bigHeap) == len(this.smallHeap) {  heap.Push(&this.smallHeap, num)  heap.Push(&this.bigHeap, heap.Pop(&this.smallHeap).(int))  } else {  heap.Push(&this.bigHeap, num)  heap.Push(&this.smallHeap, heap.Pop(&this.bigHeap).(int))  }  
}  func (this *MedianFinder) FindMedian() float64 {  if len(this.bigHeap) == len(this.smallHeap) {  return float64(this.bigHeap[0]+this.smallHeap[0]) / 2.0  }  return float64(this.bigHeap[0])  
}  
​
​
/*** Your MedianFinder object will be instantiated and called as such:* obj := Constructor();* obj.AddNum(num);* param_2 := obj.FindMedian();*/


http://www.ppmy.cn/news/1539748.html

相关文章

JsonObject (JSON 数据中的一个对象)

JsonObject 是 Gson 库中的一个类&#xff0c;它表示 JSON 数据中的一个对象。以下是 JsonObject 类的一些常用方法及其详细解释和代码案例&#xff1a; 1.addProperty(String memberName, String value) 向 JsonObject 中添加一个键值对&#xff0c;其中值是字符串。参数&am…

Centos 7.5上配置mailx发送邮件

客户环境中有需要监视的URL页面&#xff0c;获取status状态码&#xff0c;记录到对应日志文件中。 如果无法访问出现其他status状态码则发送到指定邮箱中。 #!/bin/bash# 要监控的URL URL"http://example.com"# 期望的状态码 EXPECTED_STATUS200# 日志文件路径 LOG…

Spring Boot环境下的图书进销存管理系统

3系统分析 3.1可行性分析 通过对本图书进销存管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本图书进销存管理系统采用Spring Boot框架&#xff0c;JA…

conda新建环境中存在大量ros相关python包

1 问题现象 新建的conda环境&#xff0c;执行pip list&#xff0c;出现了大量的ros相关包&#xff0c;环境不纯净。重新安装anaconda没有用。 2 问题原因 2.1 执行python -m site 执行python -m site获得以下结果 其中sys.path包含了’/opt/ros/noetic/lib/python3/dist-…

鸿蒙开发(NEXT/API 12)【拦截器 (C/C++)】远场通信场景

场景介绍 请求拦截器。可用于拦截请求&#xff0c;修改Rcp_Request请求相关内容&#xff0c;或者检查本地缓存直接返回响应等等。 开发步骤 CPP侧导入模块。 #include "RemoteCommunicationKit/rcp.h" #include <cstdlib> #include <stdio.h> #inclu…

查看 Git 的配置信息

查看 Git 的配置信息 1. 查看所有配置项 git config --list这个命令会显示所有级别&#xff08;系统级、全局级和本地级&#xff09;的 Git 配置项。 2. 查看全局配置 git config --global --list仅显示全局范围内的配置项&#xff0c;这些配置通常存储在 ~/.gitconfig 或 …

python+Mosh网课笔记01

太久没写python代码了&#xff0c;学机器学习重新拾起python&#xff0c;笔记比较简陋。 参考&#xff1a;mosh的python教程 一、入门 用vscode编写代码。下载了autopep8插件用于代码格式化。下载了pylint插件用于代码报错提示。 二、基本类型 int&#xff0c;bool&#x…

「爱码士找Bug」第七弹

用Python实现一条SQL语句中只有前两个字段是变化的&#xff0c;而其他字段都是固定值。代码如下&#xff1a; # 假设固定值字段 fixed_columns ["column3", "column4"] # 假设有更多固定列 fixed_values ["fixed_value3", "fixed_value…