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

news2024/11/24 4:59:28

文章目录

  • 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 . 区域和检索 - 数组可修改

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用IDA查看汇编代码,结合安卓系统生成的Tombstone文件,分析安卓app程序崩溃问题

目录 1、IDA工具介绍 2、产品及问题场景描述 3、查看Tombstone文件 4、使用IDA打开.so动态库文件&#xff0c;查看汇编代码的上下文&#xff0c;到C源码中定位发生崩溃的那行代码 4.1、使用IDA打开.so动态库文件 4.2、切换到Text View文本视图模式 4.3、根据相对于函数的…

【Linux进程篇】环境变量

【Linux进程篇】环境变量 目录 【Linux进程篇】环境变量基本概念常见环境变量查看环境变量方法测试PATH测试HOME测试SHELL和环境变量相关的命令环境变量的组织方式通过代码如何获取环境变量命令行参数命令行第三个参数通过第三方变量environ获取 本地变量通过系统调用获取或设置…

【Sklearn】基于K邻近算法的数据分类预测(Excel可直接替换数据)

【Sklearn】基于K邻近算法的数据分类预测&#xff08;Excel可直接替换数据&#xff09; 1.模型原理模型原理&#xff1a;数学模型&#xff1a; 2.模型参数3.文件结构4.Excel数据5.下载地址6.完整代码7.运行结果 1.模型原理 K最近邻&#xff08;K-Nearest Neighbors&#xff0c…

C++入门篇8---vector

vecctor是动态顺序表 一、了解vector的相关接口及其功能 1.构造函数相关接口 函数声明功能介绍vector()无参构造vector(size_type n,const value_type& valvalue_type())构造并初始化n个valvector(const value& x)拷贝构造vector(InputIterator first, InputIterato…

ad+硬件每日学习十个知识点(33)23.8.13 (导出gerber)

文章目录 1.第一次制造输出2.第二次制造输出3.第三次制造输出 1.第一次制造输出 答&#xff1a; 2.第二次制造输出 答&#xff1a; 3.第三次制造输出 答&#xff1a;

企业计算机服务器中了Devos勒索病毒怎么办,勒索病毒解密

社会在发展&#xff0c;科技在进步&#xff0c;企业的生产也得到了很大改善&#xff0c;但是随着网络技术的不断发展&#xff0c;越来越多的企业遭到的网络安全威胁开始增多&#xff0c;其中较为明显的就是勒索病毒攻击。预防勒索病毒攻击成为日常生活中不可或缺的一部分工作。…

Python—行命令搭建HTTP服务器并外网访问本地SQL Server数据库【无公网IP内网穿透】

在强者的眼中&#xff0c;没有最好&#xff0c;只有更好。我们是移动开发领域的优质创作者&#xff0c;同时也是阿里云专家博主。 ✨ 关注我们的主页&#xff0c;探索iOS开发的无限可能&#xff01; &#x1f525;我们与您分享最新的技术洞察和实战经验&#xff0c;助您在移动…

MySQL中事务特性以及隔离机制

目录 一、什么是事务 二、事务特性——即ACID特性 三、事务的隔离级别 1、脏读 2、不可重复读 3、幻读 Read uncommitted&#xff1a; Read committed: Repeatable read: Serializable&#xff1a; 一、什么是事务 事务&#xff08;Transaction&#xff09;——一个最…

小程序用户隐私新规,微信小程序开发者需满足新要求

微信公众平台运营中心最新公告指出&#xff0c;从2023年9月15日开始&#xff0c;涉及处理用户个人信息的小程序开发者需要满足新要求。开发者须主动同步用户同意并遵守小程序的隐私保护指引和其他信息处理规则&#xff0c;方可调用微信提供的隐私接口。 并且&#xff0c;在确认…

第四章,向量组,1-向量组与线性组合、线性表示

第四章&#xff0c;向量组&#xff0c;1-向量组与线性组合、线性表示 向量方程向量与向量组向量向量组 线性组合与线性表示线性组合 线性表示定理定义 多表多&#xff08;单向&#xff09;定理推论 定义 等价&#xff08;多表多&#xff1a;双向&#xff09; 知识回顾 玩转线性…

用免费Leangoo敏捷看板工具进行可视化的缺陷跟踪管理

用Leangoo敏捷看板进行可视化的缺陷跟踪管理 缺陷管理通常关注如下几个方面&#xff1a; 1. 缺陷的处理速度 2. 缺陷处理的状态 3. 缺陷的分布 4. 缺陷产生的原因 使用Leangoo敏捷看板我们可以对缺陷进行可视化的管理&#xff0c;方便我们对缺陷的处理进展、负责人、当前…

转行软件测试四个月学习,第一次面试经过分享

我是去年上半年从销售行业转行到测试的&#xff0c;从销售公司辞职之后选择去培训班培训软件测试&#xff0c;经历了四个月左右的培训&#xff0c;在培训班结课前两周就开始投简历了&#xff0c;在结课的时候顺利拿到了offer。在新的公司从事软件测试工作已经将近半年有余&…

云渲染效果不对?云渲染前的四个细节表明你的问题出在这里!

云渲染针对3D渲染行业&#xff0c;帮助本地电脑解决渲染慢的问题&#xff0c;大幅提高设计师的工作效率。但小编发现&#xff0c;有不少小伙伴在使用云渲染时&#xff0c;出现了渲染效果不对或丢失的问题&#xff0c;根据小伙伴们的问题和我们创意云云渲染平台给出的解决方案&a…

vue之动态表单(优化)

代码资源在这儿 ↑ vue之动态表单优化 vue2js动态表单优化vue3ts动态表单优化 vue2js动态表单优化 效果图 目录结构 五个文件的完整代码: 以下是App.vue <template><div><router-view></router-view><Formpage /></div> </templa…

【数据结构】栈与队列

1 栈 1.1 栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出 LIFO (Last In First Out) 的原则。 压栈&#xff1a;栈…

java中右移>>和无符号右移>>>的区别

public static void main(String[] args) {byte[] dest new byte[2];dest[0] 0x15; //0001 0101dest[1] (byte) 0xfb;//1111 1011System.out.println((dest[0] >> 4) & 0xff);//右移 应该是0000 0001 十进制结果显示1 结果也是1&#xff0c;正确System.out.printl…

【小练习】交互式网格自定义增删改错误记录及解决(进行中)

经过之前的学习&#xff0c;已经能创建简单的交互式网格并设置自定义增删改按钮&#xff0c;但是实现上还是存在一些问题&#xff0c;来完善优化一下。 首先是修改&#xff0c;正常修改都会弹出修改框&#xff0c;里面是之前存储的信息&#xff0c;根据实际需要对其进行修改&a…

小程序多图片组合

目录 子组件 index.js 子组件 index.wxml 子组件 index.wxss 父组件引用&#xff1a; 子组件&#xff1a;preview-image 子组件 index.js Component({properties: {previewData: {type: Array,default: [],observer: function (newVal, oldVal) {console.log(newVal, ol…

AppStream下载元数据失败

错误&#xff1a;为仓库 AppStream 下载元数据失败 : Cannot prepare internal mirrorlist: No URLs in mirrorlist 目录 一、域名解析 二、CentOS-AppStream.repo 三、CentOS-Base.repo 四、CentOS-Extras.repo 五、rpm更新 一、域名解析 先验证 ping www.baidu.com 不…

【C语言】结构体解谜:拆解数据的力量!

&#x1f341;博客主页&#xff1a;江池俊的博客 &#x1f4ab;收录专栏&#xff1a;C语言—探索高效编程的基石 &#x1f4a1;代码仓库&#xff1a;江池俊的代码仓库 &#x1f3aa;我的社区&#xff1a;GeekHub &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐…