当前位置: 首页 > article >正文

算法刷题记录——LeetCode篇(3.10) [第291~300题](持续更新)

更新时间:2025-04-02

  • 算法题解目录汇总:算法刷题记录——题解目录汇总
  • 技术博客总目录:计算机技术系列博客——目录页

优先整理热门100及面试150,不定期持续更新,欢迎关注!


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 以内的答案将被接受。

示例 1:

输入:
["MedianFinder", "addNum", "addNum", "findMedian", "addNum", "findMedian"]
[[], [1], [2], [], [3], []]
输出:
[null, null, null, 1.5, null, 2.0]

解释:

MedianFinder medianFinder = new MedianFinder();
medianFinder.addNum(1);    // arr = [1]
medianFinder.addNum(2);    // arr = [1, 2]
medianFinder.findMedian(); // 返回 1.5 ((1 + 2) / 2)
medianFinder.addNum(3);    // arr[1, 2, 3]
medianFinder.findMedian(); // return 2.0

提示:

  • -10^5 <= num <= 10^5
  • 在调用 findMedian 之前,数据结构中至少有一个元素
  • 最多 5 * 10^4 次调用 addNum 和 findMedian

方法:双堆法

使用两个堆(大顶堆和小顶堆)分别存储数据流的较小和较大半部分,实现中位数的快速查询。

  1. 数据结构设计

    • 大顶堆存储较小半部分元素,堆顶为最大元素
    • 小顶堆存储较大半部分元素,堆顶为最小元素
    • 始终维持大顶堆元素数 ≥ 小顶堆元素数
  2. 添加元素流程

    1. 新元素先加入大顶堆
    2. 将大顶堆的最大值传递给小顶堆
    3. 若小顶堆元素更多,返还最小值到大顶堆
  3. 中位数计算

    • 当元素总数为奇数时,直接返回大顶堆堆顶
    • 当元素总数为偶数时,返回两堆顶平均值

代码实现(Java):

class MedianFinder {private PriorityQueue<Integer> maxHeap; // 存储较小的一半(大顶堆)private PriorityQueue<Integer> minHeap; // 存储较大的一半(小顶堆)public MedianFinder() {maxHeap = new PriorityQueue<>(Collections.reverseOrder());minHeap = new PriorityQueue<>();}public void addNum(int num) {// 1. 先加入大顶堆并传递最大值到小顶堆maxHeap.offer(num);minHeap.offer(maxHeap.poll());// 2. 平衡堆大小,保证大顶堆不小于小顶堆if (minHeap.size() > maxHeap.size()) {maxHeap.offer(minHeap.poll());}}public double findMedian() {// 根据堆大小差异返回中位数return maxHeap.size() > minHeap.size() ? maxHeap.peek() : (maxHeap.peek() + minHeap.peek()) / 2.0;}
}

复杂度分析

  • 时间复杂度
    • addNum(): O(log n) 堆插入和删除操作
    • findMedian(): O(1) 直接访问堆顶
  • 空间复杂度O(n) 存储所有元素

300. 最长递增子序列

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
示例 1:

输入:nums = [10,9,2,5,3,7,101,18]
输出:4

解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。

示例 2:

输入:nums = [0,1,0,3,2,3]
输出:4

示例 3:

输入:nums = [7,7,7,7,7,7,7]
输出:1

提示:

  • 1 <= nums.length <= 2500
  • -10^4 <= nums[i] <= 10^4

进阶:
你能将算法的时间复杂度降低到 O(n log(n)) 吗?

方法一:动态规划

使用动态规划数组 dp[i] 表示以 nums[i] 结尾的最长递增子序列长度。对于每个元素,遍历其之前的所有元素,若当前元素更大,则更新 dp[i]

代码实现(Java):

class Solution {public int lengthOfLIS(int[] nums) {int[] dp = new int[nums.length];Arrays.fill(dp, 1);int max = 1;for (int i = 1; i < nums.length; i++) {for (int j = 0; j < i; j++) {if (nums[i] > nums[j]) {dp[i] = Math.max(dp[i], dp[j] + 1);}}max = Math.max(max, dp[i]);}return max;}
}

方法二:贪心 + 二分查找

维护一个 tails 数组,tails[i] 表示长度为 i+1 的递增子序列的最小末尾元素。通过二分查找快速定位插入或替换位置。

代码实现(Java):

class Solution {public int lengthOfLIS(int[] nums) {List<Integer> tails = new ArrayList<>();for (int num : nums) {int left = 0, right = tails.size();// 二分查找第一个 >= num 的位置while (left < right) {int mid = left + (right - left) / 2;if (tails.get(mid) < num) {left = mid + 1;} else {right = mid;}}if (left == tails.size()) {tails.add(num);} else {tails.set(left, num);}}return tails.size();}
}

复杂度分析

方法时间复杂度空间复杂度适用场景
动态规划O(n²)O(n)简单直观,小规模数据
二分+贪心O(n log n)O(n)大规模数据,效率要求高


声明

  1. 本文版权归 CSDN 用户 Allen Wurlitzer 所有,遵循CC-BY-SA协议发布,转载请注明出处。
  2. 本文题目来源 力扣-LeetCode ,著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

相关文章:

算法刷题记录——LeetCode篇(3.10) [第291~300题](持续更新)

更新时间&#xff1a;2025-04-02 算法题解目录汇总&#xff1a;算法刷题记录——题解目录汇总技术博客总目录&#xff1a;计算机技术系列博客——目录页 优先整理热门100及面试150&#xff0c;不定期持续更新&#xff0c;欢迎关注&#xff01; 295. 数据流的中位数 中位数是…...

conda 激活环境vscode的Bash窗口

多份conda环境注意事项&#xff0c;当时安装了两个conda环境&#xff0c;miniconda和conda&#xff0c;导致环境总是冲突矛盾。初始化时需要更加注意。 $ C:/Users/a_hal/miniconda3/Scripts/conda.exe init bash能够显示用哪里的conda环境命令执行。 然后直接conda activate…...

网线和跳线

文章目录 一、网线二、跳线三、区别对比一句话总结 一、网线 网线&#xff08;网路线&#xff09;&#xff1a; 它是一种用来连接网络设备的线&#xff0c;比如&#xff1a; 把 电脑连到交换机把 路由器连到光猫把 交换机和交换机连接起来 它的本质是&#xff1a;传输网络信…...

火山 RTC 引擎 2 ----APPKEY

前篇文章&#xff1a;火山RTC引擎 --一次失望的体验 那个DEMO可以编译运行了&#xff0c;但是功能不能用&#xff0c; 一用就崩溃。 主要原因还是没有APPKEY 一、火山引擎 APPKEY 管理 1、登录后台 账号登录-火山引擎欢迎登录火山引擎&#xff0c;火山引擎是字节跳动旗下的云…...

Linux中进程与计划任务

目录 一.进程 1.进程相关概念 2.进程的特征 3.进程相关的命令 3.1 ps命令 3.2 top命令 3.3 pgrep命令 3.4 pstree命令进程树 3.5 kill命令 二.计划任务 1.一次性任务 2.周期性任务crontab 三.本章涉及面试题 1.运维需要关注服务器的系统性能及如何查看 一.进程 1…...

Springboot学习笔记3.28

目录 实战第六课&#xff1a;文章分类开发 新增文章分类&#xff1a; 具体实现&#xff1a; 查询文章分类&#xff1a; 具体实现&#xff1a; 获取文章分类的详情 更新文章分类&#xff1a; 注意点&#xff1a; ​编辑 对校验规则进行分组&#xff1a; 学习时的疑惑…...

【CSS3】05-定位 + 修饰属性

本文介绍定位和CSS中的修饰属性。 目录 1. 定位 1.1 相对定位 1.2 绝对定位 1.3 定位居中 1.4 固定定位 1.5 z-index堆叠层级 2. 修饰属性 2.1 垂直对齐方式 vertical-align 2.2 过渡属性 2.3 透明度 opacity 2.4 光标类型 cursor 1. 定位 灵活改变盒子在网页中的位…...

C 语言测验

C 语言测验 引言 C 语言作为一种历史悠久且广泛使用的编程语言,自1972年由Dennis Ritchie在贝尔实验室发明以来,一直是计算机科学领域的基石。C 语言以其高效、灵活、可移植的特点,在操作系统、嵌入式系统、游戏开发等多个领域占据着重要地位。为了帮助读者深入了解C语言,…...

如何屏蔽mac电脑更新提醒,禁止系统更新

最烦mac的系统更新提醒了&#xff0c;过几天就是更新弹窗提醒&#xff0c;现在可以直接禁掉了&#xff0c;眼不见心不乱&#xff0c;不然一升级&#xff0c;开发环境全都不能用了&#xff0c;那才是最可怕的&#xff0c;屏蔽的方法也很简单&#xff0c;就是屏蔽mac系统更新的请…...

tcp的粘包拆包问题,如何解决?

TCP的粘包和拆包问题是由于TCP协议面向流的特性导致数据边界不明确&#xff0c;解决方案需在应用层明确数据包边界。以下是具体解决方法&#xff1a; 1. 固定长度消息&#xff08;Fixed-Length Protocol&#xff09; 实现方式&#xff1a;每个数据包长度固定&#xff0c;不足…...

Rclone同步Linux数据到google云盘

文章目录 Rclone管理云存储Rclone安装和使用说明安装rclone配置rclone连接到云盘基本备份命令高级备份选项自动化备份加密备份&#xff08;可选&#xff09;恢复数据常见云存储服务名称注意事项 googleCloud 平台中操作OAuth权限请求页面&#xff08;OAuth同意屏幕&#xff09;…...

AI人工智能-Jupyter NotbookPycharm:Py开发

安装 命令&#xff1a; pip install jupyter 启动 命令&#xff1a; jupyter notebook 启动成功后&#xff0c;下面网址会默认自动打开当前用户的根目录。 其实这个页面显示的内容&#xff0c;是我们电脑目录C:\Users\当前用户\下的文件夹 我们平常做实验&#xff0c;希望在…...

DDR简介

一、什么是DDR&#xff1f; DDR SDRAM&#xff08;Double Data Rate Synchronous DYNAMIC RAM&#xff09;中文名是&#xff1a;双倍数据速率同步动态随机存储器。 传统的SDRAM只在时钟信号的上升沿传输数据&#xff0c;而DDR可以同时在时钟的上升沿和下降沿传输数据&#xf…...

Kubernetes 入门篇之 Node 安装与部署

上篇记录了Master节点的安装与部署&#xff0c;本篇记录一下node的安装与部署。 1. 基础环境配置 关闭防火墙与交换分区&#xff08;swap&#xff09;&#xff0c;关闭selinux&#xff0c;配置yum源参考上篇&#xff1b;启用 IPv4 数据包转发 和 iptables 网络过滤参考上篇&a…...

企业数据治理实践:“七剑” 合璧,释放数据价值

在数字化转型的浪潮中&#xff0c;数据已成为企业的核心资产&#xff0c;其治理水平直接关乎企业的竞争力和可持续发展能力。数据模型治理、元数据治理、数据质量治理、数据标准治理、主数据治理、数据安全治理以及数据服务平台治理&#xff0c;共同构成了企业数据治理的关键体…...

VRRP(虚拟路由器冗余协议)、虚拟路由器、master路由器、backup路由器

VRRP(虚拟路由器冗余协议) 1、介绍 虚拟路由冗余协议 VRRP (Virtual Router Redundancy Protocol)通过把几台路由设备联合组成一台虚拟的路由设备&#xff0c;将虚拟路由设备的IP地址作为用户的默认网关实现与外部网络通信。当网关设备发生故障时&#xff0c;VRRP机制能够选举…...

基本元素定位(findElement方法)

通过ID定位&#xff1a;使用元素的ID属性进行定位&#xff0c;是最简单和最常用的方法&#xff0c;因为ID在页面上是唯一的。 //定位百度的搜索框元素&#xff0c;并且输入数据(ID定位)-唯一 chromeDriver.findElement(By.id("kw")).sendKeys("腾讯课堂")…...

多模态RAG实践:如何高效对齐不同模态的Embedding空间?

目录 多模态RAG实践&#xff1a;如何高效对齐不同模态的Embedding空间&#xff1f; 一、为什么需要对齐Embedding空间&#xff1f; 二、常见的对齐方法与关键技术点 &#xff08;一&#xff09;对比学习&#xff08;Contrastive Learning&#xff09; &#xff08;二&#…...

Cesium 核心思想及基础概念应用

文章目录 Cesium 基础理解&#xff08;一&#xff09;1. 场景&#xff08;Scene&#xff09;2. 查看器&#xff08;Viewer&#xff09;3. 相机&#xff08;Camera&#xff09;4. 实体&#xff08;Entity&#xff09;5. 图元&#xff08;Primitive&#xff09;6. 数据加载与解析…...

vue中的 拖拽

拖拽总结 实现方式特点适用场景HTML5 原生拖拽 API✅ 直接使用 dataTransfer 进行数据传输 ✅ 兼容性好&#xff08;大部分浏览器支持&#xff09; ✅ 适合简单的拖拽场景低代码平台、表单生成器、组件拖拽Vue/React 组件库&#xff08;如 Vue Draggable、SortableJS&#xff…...

Linux进程间通信(1)

1.IPC 1.什么是IPC&#xff1f; Inter Process Communication 2.进程间通信常用的几种方式 1&#xff0c;管道通信&#xff1a;有名管道&#xff0c;无名管道 2&#xff0c;信号- 系统开销小 3&#xff0c;消息队列-内核的链表 4&#xff0c;信号量-计数器 5&#xff0c;共享…...

Scala相关知识学习总结3

包 - 包声明&#xff1a;和Java类似&#xff0c;作用是区分同名类、管理类命名空间。Scala包名只能含数字、字母等&#xff0c;不能数字开头、不能用关键字。 - 包说明&#xff1a;有类似Java的包管理风格&#xff0c;也有独特嵌套风格。嵌套风格有两个特点&#xff0c;一是&…...

Opencv计算机视觉编程攻略-第七节 提取直线、轮廓和区域

第七节 提取直线、轮廓和区域 1.用Canny 算子检测图像轮廓2.用霍夫变换检测直线&#xff1b;3.点集的直线拟合4.提取连续区域5.计算区域的形状描述子 图像的边缘区域勾画出了图像含有重要的视觉信息。正因如此&#xff0c;边缘可应用于目标识别等领域。但是简单的二值边缘分布图…...

中和农信:让金融“活水”精准浇灌乡村沃土

2025年政府工作报告首提“投资于人”概念&#xff0c;并22次提及“金融”&#xff0c;强调要着力抓好“三农”工作&#xff0c;深入推进乡村全面振兴&#xff1b;一体推进地方中小金融机构风险处置和转型发展&#xff1b;扎扎实实落实促进民营经济发展的政策措施&#xff0c;切…...

背包DP总结

牛客周赛 Round 81 E.建筑入门 知识点&#xff1a;完全背包&#xff0c;完全背包的路径转移以及回溯 由题意可以推导出&#xff0c;下层麻将的数字一定大于上层数字&#xff0c;所以我们可以假设一个最基础的麻将塔&#xff0c;也就是&#xff1a; 1 2 2 3 3 3 … 形如这样的&…...

Labview信号采集与多功能分析系统(可仿真)

1.摘要 《Labview信号采集与多功能分析系统》可以实时分析信号的时域特征&#xff0c;例如信号的均值、方差、峰值、峭度等。系统可以进行信号的自相关与互关分析。此系统也可以分析信号的频域特征&#xff0c;包括快速傅里叶变换后的时频特征、短时傅里叶变换STFT后的时频域特…...

【C#使用S7.NET库读取和写入西门子PLC变量】

C#使用S7.NET库读取和写入西门子PLC变量 前言使用S7.NET库读取使用S7.NET库写入 前言 本来想用Wincc的接口给读和写Wincc&#xff0c;但是速度实在太感人了&#xff0c;所以不如直接读和写PLC的变量&#xff0c;这种方式速度瞬间快了不知道多少倍&#xff08;经测试4000个变量…...

蓝桥杯 游戏 6251 单调队列

传送门 0游戏 - 蓝桥云课 有了单调队列&#xff0c;在求解答案时&#xff1a;当我们需要对最大值的列表和最小值的列表进行俩俩组合&#xff0c;如果直接用两个f0r循环进行匹配&#xff0c;那么时间复杂度太大&#xff0c;容易超时。我们可以进行一个推导&#xff0c;假设最大…...

[250331] Paozhu 发布 1.9.0:C++ Web 框架,比肩脚本语言 | DeaDBeeF 播放器发布 1.10.0

目录 Paozhu 发布 1.9.0&#xff1a;C Web 框架&#xff0c;快速开发&#xff0c;比肩脚本语言DeaDBeeF 音乐播放器发布 1.10.0 版本&#xff01; Paozhu 发布 1.9.0&#xff1a;C Web 框架&#xff0c;快速开发&#xff0c;比肩脚本语言 Paozhu (炮竹&#x1f9e8;) 是一个功…...

einsum函数

理解专家并行&#xff0c;需要了解einsum函数 import torch# 设置输入张量的维度&#xff1a;s 3 tokens, e 2 experts, c 2 capacity, m 4 embedding dim s, e, c, m 3, 2, 2, 4# 1. 输入 token 的嵌入向量 (s, m) reshaped_input torch.tensor([[1.0, 1.0, 1.0, 1.0],…...