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

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

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

相关文章

java重写与重载的区别

在Java中&#xff0c;重写&#xff08;Override&#xff09;和重载&#xff08;Overload&#xff09;是两种不同的概念&#xff1a; 重写&#xff08;Override&#xff09;&#xff1a; 重写是指子类重新定义&#xff08;覆盖&#xff09;了从父类继承而来的方法。重写要求子类…

ROSpider机器人评测报告

ROSpider机器人评测报告 最近入手了一款ROSpider六足仿生机器人&#xff0c;ROSpider是一款基于ROS 操作系统开发的智能视觉六足机器人。 外观 外观上ROSpider六足机器人如同名字一样有六只机械腿&#xff0c;整体来看像一只六腿的蜘蛛。腿上的关节处用了明亮的橙黄色很是显…

Redis实现消息的发布和订阅

Redis实现消息的发布和订阅 1、在springboot项目的pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schem…

cookie和session的区别,分布式环境怎么保存用户状态

1、cookie数据存放在客户的浏览器上&#xff0c;session数据放在服务器上。 2、cookie不是很安全&#xff0c;别人可以分析存放在本地的COOKIE并进行COOKIE欺骗&#xff0c;考虑到安全应当使用session。 3、session会在一定时间内保存在服务器上。当访问增多&#xff0c;会比…

js和cocos creator学习笔记

1.Javascript有哪些数据类型?举例两个最常见的内置对象数据类型? 常用的数据类型:Number,String,Boolean,Null,Undefined,Object 常见内置对象:Array,Function2.下面代码输出内容是什么? let a []; a[10] 10; console.log(a.length); console.log(a[0]); a[200] undefi…

arcpy创建基本要素:折线和多边形

目录 创建Polyline折线要素步骤一&#xff1a;创建空间参考步骤二&#xff1a;创建属性类步骤三&#xff1a;创建字段步骤四&#xff1a;创建记录并插入几何信息 创建Polygon多边形要素步骤一&#xff1a;创建空间参考&#xff08;同上&#xff09;步骤二&#xff1a;创建要素类…

Redis使用Lua脚本和Redisson来保证库存扣减中的原子性和一致性

文章目录 前言1.使用SpringBoot Redis 原生实现方式2.使用redisson方式实现3. 使用RedisLua脚本实现3.1 lua脚本代码逻辑 3.2 与SpringBoot集成 4. Lua脚本方式和Redisson的方式对比5. 源码地址6. Redis从入门到精通系列文章7. 参考文档 前言 背景&#xff1a;最近有社群技术交…

C++——函数重载及底层原理

函数重载的定义 函数重载&#xff1a; 是函数的一种特殊情况&#xff0c;C允许在同一作用域重声明几个功能类似的同名函数&#xff0c;这些同名函数的形参列表&#xff08;参数个数或者类型&#xff0c;类型的顺序&#xff09;不同&#xff0c;常用来处理实现功能类似数据结构…

C语言字符串拷贝函数详解及示例代码

目录 简介字符串拷贝函数 strcpy字符串拷贝函数 strcpy_s使用示例注意事项结束语 1. 简介 字符串拷贝是C语言中常用的操作之一。当需要将一个字符串复制到另一个字符串数组中时&#xff0c;可以使用字符串拷贝函数来实现。C语言提供了多种字符串拷贝函数&#xff0c;其中最常…

春秋云镜 CVE-2021-41947

春秋云镜 CVE-2021-41947 Subrion CMS v4.2.1 存在sql注入 靶标介绍 Subrion CMS v4.2.1 存在sql注入。 启动场景 漏洞利用 exp http://localhost/panel/visual-mode.json?getaccess&typeblocks UNION ALL SELECT username, password FROM sbr421_members -- -&o…

【需求输出】流程图输出

文章目录 1、什么是流程图2、绘制流程图的工具和基本要素3、流程图的分类和应用场景4、如何根据具体场景输出流程图 1、什么是流程图 2、绘制流程图的工具和基本要素 3、流程图的分类和应用场景 4、如何根据具体场景输出流程图

Dubbo1-架构的演变

分布式系统上的相关概念 项目&#xff1a;传统项目、互联网项目 传统项目&#xff1a; 一般为公司内部使用&#xff0c;或者小群体小范围的使用&#xff0c;一般不要求性能&#xff0c;美观&#xff0c;并发等 互联网项目的特点&#xff1a; 1.用户多 2.流量大&#xff0c;并…

用python来爬取某鱼的商品信息(2/2)

目录 上一篇文章 本章内容 设置浏览器为运行结束后不关闭&#xff08;可选&#xff09; 定位到搜索框的xpath地址 执行动作 获取cookie 保存为json文件 修改cookie的sameSite值并且导入cookie 导入cookie&#xff08;出错&#xff09; 导入cookie&#xff08;修改后&…

Android Ble蓝牙App(五)数据操作

Ble蓝牙App&#xff08;五&#xff09;数据操作 前言正文一、操作内容处理二、读取数据① 概念② 实操 三、写入数据① 概念② 实操 四、打开通知一、概念二、实操三、收到数据 五、源码 前言 关于低功耗蓝牙的服务、特性、属性、描述符都已经讲清楚了&#xff0c;而下面就是使…

电脑系统重装日记

重装原因 电脑C盘几乎爆炸故重装系统一清二白 此片原因 记录重装过程&#xff0c;强调一些要注意的点&#xff0c;以防日后重装。 重装过程 1.清空电脑文件后重启&#xff0c;电脑冒蓝光&#xff0c;一直蓝屏反复重启&#xff0c;故只能重装系统以解难题。 2.准备一个U盘&…

设计HTML5文档结构

定义清晰、一致的文档结构不仅方便后期维护和拓展&#xff0c;同时也大大降低了CSS和JavaScript的应用难度。为了提高搜索引擎的检索率&#xff0c;适应智能化处理&#xff0c;设计符合语义的结构显得很重要。 1、头部结构 在HTML文档的头部区域&#xff0c;存储着各种网页元…

Python Opencv实践 - 图像属性相关

import numpy as np import cv2 as cv import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_COLOR) plt.imshow(img[:,:,::-1])#像素操作 pixel img[320,370] print(pixel)#只获取蓝色通道的值 pixel_blue img[320,370,0]…

【Hystrix技术指南】(7)故障切换的运作流程原理分析(含源码)

背景介绍 目前对于一些非核心操作&#xff0c;如增减库存后保存操作日志发送异步消息时&#xff08;具体业务流程&#xff09;&#xff0c;一旦出现MQ服务异常时&#xff0c;会导致接口响应超时&#xff0c;因此可以考虑对非核心操作引入服务降级、服务隔离。 Hystrix说明 官方…

Grounding DINO:根据文字提示检测任意目标

文章目录 1. 背景介绍2. 方法创新2.1 Feature Extraction and Enhancer2.2 Language-Guided Query Selection2.3 Cross-Modality Decoder2.4 Sub-Sentence Level Text Feature2.5 Loss Function3. 实验结果3.1 Zero-Shot Transfer of Grounding DINO3.2 Referring Object Detec…

设备管理系统能起到什么作用?

在现代工业运营中&#xff0c;设备的高效管理和维护对于保障生产稳定运行和提升企业竞争力至关重要。而设备管理系统作为一种关键工具&#xff0c;能够极大地提高企业的生产效率和设备维护的准确性。本文将深入探讨设备管理系统的作用&#xff0c;以PreMaint设备数字化平台为例…