【LeetCode】《LeetCode 101》第十一章:妙用数据结构

文章目录

  • 11.1 C++ STL
  • 11.2 数组
    • 448. 找到所有数组中消失的数字(简单)
    • 48. 旋转图像(中等)
    • 74. 搜索二维矩阵(中等)
    • 240. 搜索二维矩阵 II(中等)
    • 769. 最多能完成排序的块(中等)
    • 768. 最多能完成排序的块 II(困难)
  • 11.3 栈和队列
    • 232. 用栈实现队列(简单)
    • 155. 最小栈(中等)
    • 20. 有效的括号(简单)
  • 11.4 单调栈
    • 739. 每日温度(中等)
  • 11.5 优先队列
    • 23. 合并 K 个升序链表(困难)
    • 218. 天际线问题(困难)
  • 11.6 双端队列
    • 239. 滑动窗口最大值(困难)
  • 11.7 哈希表
    • 1. 两数之和(简单)
    • 128. 最长连续序列(中等)
    • 149. 直线上最多的点数(困难)
  • 11.8 多重集合和映射
    • 332. 重新安排行程(困难)
  • 11.9 前缀和与积分图
    • 303. 区域和检索 - 数组不可变(简单)
    • 304. 二维区域和检索 - 矩阵不可变(中等)
    • 560. 和为 K 的子数组(中等)
  • 11.10 练习
    • 566. 重塑矩阵(简单)
    • 225. 用队列实现栈(简单)
    • 503. 下一个更大元素 II(中等)
    • 217. 存在重复元素(简单)
    • 697. 数组的度(简单)
    • 594. 最长和谐子序列(简单)
    • 287 . 寻找重复数(中等)
    • 313. 超级丑数
    • 870 . 优势洗牌
    • 307 . 区域和检索 - 数组可修改

11.1 C++ STL

C++ 提供的数据结构包括:

  1. Sequence Containers:维持顺序的容器。

    • vector:动态数组,用于 O(1) 的随机读取。因为大部分算法的时间复杂度都会大于 O(n) ,因此我们经常新建 vector 来存储各种数据或中间变量。
    • list:双向链表,也可以当作 stack 和 queue 来使用。由于 LeetCode 的题目多用 Node 来表示链表,且链表不支持快速随机读取,因此很少用到该数据结构。 一个例外是经典的 LRU 问题,需要利用链表的特性来解决。
    • deque:双端队列,既支持 O(1) 的随机读取,又支持 O(1) 时间的头部增删和尾部增删,不过有一定的额外开销。
    • array:固定大小的数组,一般不使用。
    • forward_list:单向链表,一般不使用。
  2. Container Adaptors:基于其他容器实现的数据结构。

    • stack:后入先出(LIFO) 的数据结构,默认基于 deque 实现,stack常用于深度优先搜索、字符串匹配问题以及单调栈问题
    • queue:先入先出(FIFO) 的数据结构,默认基于 deque 实现,queue 常用于广度优先搜索
    • priority_queue:最大值先出的数据结构,默认基于 vector 是实现堆结构。它可以在 O(n logn) 的时间排序数组, O(logn) 的时间插入任意值,O(1) 的时间获得最大值, O(logn) 的时间删除最大值。 priority_queue 常用于维护数据结构并快速获取最大或最小值。
  3. Associative Containers:实现了排好序的数据结构。

    • set:有序集合,元素不可以重复,底层实现默认为红黑树,即一种特殊的二叉查找树(BST)。它可以在 O(nlogn) 的时间排序数组,O(logn) 的时间插入、删除、查找任意值,O(logn) 的时间获得最小或最大值。

      这里注意,set 和 priority_queue 都可以用于维护数据结构并快速获取最大最小值,但是它们的时间复杂度和功能略有区别。比如, priority_queue 默认不支持删除任意值,而 set 获得最大或最小值的时间复杂度略高。

    • multiset:支持重复元素的 set

    • map: 有序映射或有序表,在 set 的基础上加上映射关系,可以对每个元素 key 存一个值 value。

    • multimap:支持重复元素的 map

  4. Unordered Associative Containers:对每个 Associative Containers 实现了哈希版本

    • unordered_set :哈希集合,可以在 O(1) 的时间快速插入、查找、删除元素,常用于快速查询一个元素是否在这个容器内。
    • unordered_multiset:支持重复元素的 unordered_set 。
    • unordered_map:哈希映射或哈希表,在 unordered_set 的基础上加上映射关系,可以对每一个元素 key 存一个值 value。在某些情况下,如果 key 的范围已知且较小,我们也可以用 vector 代替 unordered_map,用位置表示 key,每个位置的值表示 value。
    • unordered_multimap:支持重复元素的 unordered_map。

11.2 数组

448. 找到所有数组中消失的数字(简单)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路及代码: 448. 找到所有数组中消失的数字

48. 旋转图像(中等)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路及代码: 48. 旋转图像

74. 搜索二维矩阵(中等)

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

思路及代码: 74. 搜索二维矩阵

240. 搜索二维矩阵 II(中等)

在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路及代码:240. 搜索二维矩阵 II

769. 最多能完成排序的块(中等)

在这里插入图片描述
在这里插入图片描述

思路及代码: 769. 最多能完成排序的块

768. 最多能完成排序的块 II(困难)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
思路及代码: 768. 最多能完成排序的块 II

11.3 栈和队列

232. 用栈实现队列(简单)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路及代码: 232. 用栈实现队列

155. 最小栈(中等)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路及代码: 155. 最小栈

20. 有效的括号(简单)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路及代码: 20. 有效的括号

11.4 单调栈

单调栈 通过维持栈内值的单调递增(递减)性,在整体 O(n) 的时间内处理需要大小比较的问题。

739. 每日温度(中等)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路及代码: 739. 每日温度

11.5 优先队列

  • 优先队列可以在 O(1) 时间内获得最大值,并且可以在 O(log n) 时间内取出最大值或插入任意值。

  • 优先队列常常用 来实现。堆是一个完全二叉树,其每个节点的值总是大于等于子节点的值。实际实现堆的时候,通常用数组而不是指针建立一个树,这是因为堆是完全二叉树,所以用数组表示的时候,位置 i 的节点的父节点位置一定是 (i-1)/2 ,而它的两个子节点的位置又一定分别为 2i+12i+2

  • 以下是堆的实现方法,其中最核心的两个操作是上浮下沉:.

    • 如果一个节点比父节点大,那么需要交换这两个节点;交换后它可能比新的父节点还大,因此需要不断进行比较和交换操作,称之为上浮

    • 如果一个节点比父节点小,那么也需要不断地进行向下比较和交换操作,称之为下沉

      如果一个节点有两个子节点,我们总是交换最大的子节点。

vector<int> heap;

// 上浮
void swim(int pos){
	while(pos > 0 && heap[(pos-1)/2] < heap[pos]){
		swap(heap[(pos-1)/2], heap[pos]);
		pos = (pos - 1) / 2;
	}
}

// 下沉
void sink(int pos){
	while(2 * pos + 1 <= N){
		int i = 2 * pos + 1;
		// 两个子节点进行比较,找到更大的子节点
		if(i < N && heap[i] < heap[i+1]) ++i;
		if(heap[pos] >= heap[i]) break;
		swap(heap[pos], heap[i]);
		pos = i;
	}
}

// 插入任意值:把新数字放到最后一位,然后上浮
void push(int k){
	heap.push_back(k);
	swim(heap.size()-1);
}

// 删除最大值:把最后一个数字挪到开头,然后下沉
void pop(){
	// 原本的heap[0]就是最大值
	heap[0] = heap.back();
	heap.pop_back();
	sink(0);
} 

// 获取最大值
int top(){
	return heap[0];
}
  • 通过将算法中的大于号和小于号互换,我们也可以得到一个快速获得最小值的优先队列
  • 另外,如果在维持大小关系的同时,还需要支持查找任意值、删除任意值、维护所有数字的大小关系等操作,可以考虑使用 set 或 map来代替优先队列。

23. 合并 K 个升序链表(困难)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路及代码: 23. 合并 K 个升序链表

218. 天际线问题(困难)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
思路及代码: 218. 天际线问题

11.6 双端队列

239. 滑动窗口最大值(困难)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路及代码: 239. 滑动窗口最大值

11.7 哈希表

  • 哈希表 ,又称散列表,使用 O(n) 空间复杂度存储数据,通过哈希函数映射位置,从而实现近似 O(1) 时间复杂度的插入、查找和删除操作。
  • c++ 中的哈希集为 unordered_set ,可以查找元素是否在集合中,如果需要同时存储键和值,则需要用 unordered_map,可以用来统计频率,记录内容等。如果元素有限个,并且范围不大,则可以用一个固定大小的数组来存储或统计元素。例如我们需要统计一个字符串中所有字母的出现次数,则可以用一个长度为 26 的数组来进行统计,其哈希函数即为字母在字母表的位置,这样空间复杂度就可以降为常数。

1. 两数之和(简单)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路及代码: 1. 两数之和

128. 最长连续序列(中等)

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

思路及代码: 128. 最长连续序列

149. 直线上最多的点数(困难)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

思路及代码: 149. 直线上最多的点数

11.8 多重集合和映射

332. 重新安排行程(困难)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

思路及代码: 332. 重新安排行程

11.9 前缀和与积分图

  • 一维的前缀和,二维的积分图,都是把每个位置之前的一维线段或二维矩形预先存储,方便加速计算。如果需要对前缀和或积分图的值做寻址,则要存在哈希表里;如果要对每个位置记录前缀和或积分图的,则可以存储到一维或二维数组里,常常伴随着动态规划。

303. 区域和检索 - 数组不可变(简单)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路与代码: 303. 区域和检索 - 数组不可变

304. 二维区域和检索 - 矩阵不可变(中等)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路及代码: 304. 二维区域和检索 - 矩阵不可变

560. 和为 K 的子数组(中等)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路及代码: 560. 和为 K 的子数组

11.10 练习

566. 重塑矩阵(简单)

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述在这里插入图片描述

思路及代码: 566. 重塑矩阵

225. 用队列实现栈(简单)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路及代码: 225. 用队列实现栈

503. 下一个更大元素 II(中等)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路及代码: 503. 下一个更大元素 II

217. 存在重复元素(简单)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路及代码: 217. 存在重复元素

697. 数组的度(简单)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路及代码: 697. 数组的度

594. 最长和谐子序列(简单)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

思路及代码: 594. 最长和谐子序列

287 . 寻找重复数(中等)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路及代码: 287. 寻找重复数

313. 超级丑数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路及代码: 313. 超级丑数

870 . 优势洗牌

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路及代码: 870 . 优势洗牌

307 . 区域和检索 - 数组可修改

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路及代码: 307 . 区域和检索 - 数组可修改

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/74799.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT or BingChat

你相信我们对大模型也存在「迷信权威」吗&#xff1f; ChatGPT 的 GPT-4 名声在外&#xff0c;我们就不自觉地更相信它&#xff0c;优先使用它。但我用 ChatALL 比较 AI 大模型们这么久&#xff0c;得到的结论是&#xff1a; ChatGPT GPT-4 在大多数情况下确实是最强&#xf…

Element组件浅尝辄止4:Button组件

Button按钮组件&#xff1a;用途太广泛了&#xff0c;几乎参与到了日常开发中的方方面面 1.如何使用&#xff1f;How? //使用type、plain、round和circle属性来定义 Button 的样式。<el-row><el-button>默认按钮</el-button><el-button type"primar…

阿里云ACP知识点

前言&#xff1a;记录ACP错题 1、在创建阿里云ECS时&#xff0c;每台服务器必须要包含_______用来存储操作系统和核心配置。 系统盘&#xff08;不是实例&#xff0c;实例是一个虚拟的计算环境&#xff0c;由CPU、内存、系统盘和运行的操作系统组成&#xff1b;ESC实例作为云…

【RabbitMQ与SpringBoot集成测试收发消息】

【RabbitMQ与SpringBoot集成测试收发消息】 一、环境说明二、实验步骤三、小结 一、环境说明 安装环境&#xff1a;虚拟机VMWare Centos7.6 Maven3.6.3 JDK1.8RabbitMQ版本&#xff1a;rabbitmq-server-3.8.8-1.el7.noarch.rpm编程工具Idea 运行JDK为17 二、实验步骤 在Rab…

九州未来参与编制的开源领域3项团体标准获批发布

日前&#xff0c;中电标2023年第21号团体标准公告正式发布&#xff0c;其中由九州未来参与编制的3项开源领域团体标准正式获批发布&#xff0c;于2023年8月1日正式实施。 具体内容如下&#xff1a; 《T/CESA 1269-2023 信息技术 开源 术语与综述》&#xff0c;本文件界定了信息…

AWK +iptables+shell实战脚本案例

目录 一、在Centos下安装httpd 查看安装是否成功 重启httpd 查看80端口是否开放 在主机上查询 查看防火墙 在浏览器中查询主机IP地址 查看日志是否生成 二、AWK iptablesshell实战脚本案例 1、封堵扫描器 (1) 开始扫描器 特别注意&#xff1a;在Vim中尽量不要使用空格…

python_PyQt5运行股票研究python方法工具V1.2_增加折线图控件

承接【python_PyQt5运行股票研究python方法工具V1.1_增加表格展示控件】 地址&#xff1a;python_PyQt5运行股票研究python方法工具V1.1_增加表格展示控件_程序猿与金融与科技的博客-CSDN博客 目录 结果展示&#xff1a; 代码&#xff1a; 示例py文件代码&#xff08;低位股…

ubuntu 安装 cuda

ubuntu 安装 cuda 初环境与设备在官网找安装方式 本篇文章将介绍ubuntu 安装 CUDA Toolkit CUDA Toolkit 是由 NVIDIA&#xff08;英伟达&#xff09;公司开发的一个软件工具包&#xff0c;用于支持并优化 GPU&#xff08;图形处理器&#xff09;上的并行计算和高性能计算。它…

mysql的安装

首先双击mysql的安装包 双击安装包之后就会出现下面这种情况&#xff1b; 然后就会出现下面这个页面 选择developer default开发者模式&#xff0c;然后点击next 然后再点击next 再点击yes 点击excute&#xff0c;点击完之后需要稍等几分钟才能完成 上一步安装好之后点击n…

EthGlobal 巴黎站 Chainlink 获奖项目介绍

在 Web3 中&#xff0c;每一周都至关重要。项目的发布、版本的发布以及协议的更新以惊人的速度推出。开发者必须保持学习&#xff0c;随时了解最新的工具&#xff0c;并将所有他们所学的东西&#xff08;无论是旧的还是新的&#xff09;联系起来&#xff0c;以构建推动 Web3 技…

电脑垃圾清理怎么做?记住这5个方法!

“我的电脑用了快一年了吧&#xff01;现在感觉电脑里很多垃圾文件&#xff0c;但又害怕在删除这些垃圾文件时会将一些重要的文件一起删除掉。所以不敢对电脑进行清理。想问下大家平常有没有好用方法去清理电脑呀&#xff1f;感谢&#xff01;” 随着电脑使用时间的推移&#x…

AD23使用笔记

1. 如何修改原理图的页面 2. 原理图DRC&#xff1a;快捷键T D ; 或者&#xff1a;菜单→工程→validate pcb project,,,,,,,,, Altium Designer原理图错误编译检查_ad原理图如何编译和查错_y惘然__的博客-CSDN博客 3.

开源数据库Mysql_DBA运维实战 (DML/DQL语句)

DML/DQL DML INSERT 实现数据的 插入 实例&#xff1a; DELETE 实现数据的 删除 实例&#xff1a; UPDATE 实现数据的 更新 实例1&#xff1a; 实例2&#xff1a; 实例3&#xff1a; DQL DML/DQL DML语句 数据库操纵语言&#xff1a; 插入数据INSERT、删除数据DELE…

掌握Python的X篇_33_MATLAB的替代组合NumPy+SciPy+Matplotlib

numPy 通常与 SciPy( Scientific Python )和 Matplotlib (绘图库)一起使用&#xff0c;这种组合广泛用于替代 MatLab&#xff0c;是一个强大的科学计算环境&#xff0c;有助于我们通过 Python 学习数据科学或者机器学习。 文章目录 1. numpy1.1 numpy简介1.2 矩阵类型的nparra…

SQL | 分组数据

10-分组数据 两个新的select子句&#xff1a;group by子句和having子句。 10.1-数据分组 上面我们学到了&#xff0c;使用SQL中的聚集函数可以汇总数据&#xff0c;这样&#xff0c;我们就能够对行进行计数&#xff0c;计算和&#xff0c;计算平均数。 目前为止&#xff0c…

【JavaWeb】实训的长篇笔记(上)

JavaWeb的实训是学校的一门课程&#xff0c;老师先讲解一些基础知识&#xff0c;然后让我们自己开发一个比较简单的Web程序。可涉及的知识何其之多&#xff0c;不是实训课的 3 周时间可以讲得完的&#xff0c;只是快速带过。他说&#xff1a;重点是Web开发的流程。 我的实训草草…

神经网络分类算法原理详解

目录 神经网络分类算法原理详解 神经网络工作流程 反向传播算法 1) 反向传播原理 2) 应用示例 总结 正向传播 &#xff08;forward-propagation&#xff09;&#xff1a;指对神经网络沿着输入层到输出层的顺序&#xff0c;依次计算并存储模型的中间变量。 反向传播 &a…

UE4拾取物品高亮显示

UE4系列文章目录 文章目录 UE4系列文章目录前言一、如何实现 前言 先看下效果&#xff0c;当角色靠近背包然后看向背包&#xff0c;背包就会高亮显示。 一、如何实现 1.为选中物品创建蓝图接口 在“内容” 窗口中&#xff0c;鼠标右键选择“蓝图”->蓝图接口&#xff0c…

ChatGPT收录

VSCode插件-ChatGPT 多磨助手 多磨助手 (domore.run) Steamship Steamship 免费合集 免费chatGPT - Ant Design Pro 免费AI聊天室 (xyys.one)

计算机竞赛 python 机器视觉 车牌识别 - opencv 深度学习 机器学习

1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于python 机器视觉 的车牌识别系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;3分 &#x1f9ff; 更多资…