北大硕士LeetCode算法专题课-栈、队列相关问题

news2024/10/6 6:48:14

算法面试相关专题:

北大硕士LeetCode算法专题课--链表相关问题_     

北大硕士LeetCode算法专题课-查找相关问题_  

北大硕士LeetCode算法专题课-字符串相关问题_ 

 

北大硕士LeetCode算法专题课-数组相关问题_ _

北大硕士LeetCode算法专题课-基础算法之排序_ 

北大硕士LeetCode算法专题课-基础算法查找_ 

北大硕士LeetCode算法专题课---算法复杂度介绍_ 

什么是

(stack)是一种以后进先出的方式存取数据的数据结构LIFO Last-In/First-Out)  可以通过编辑器中的撤销(undo)功能来加深对栈的理解

假设我们在IDE中编辑一份Python代码,首先创建了一个函数,IDE的撤销功能就会将创建函数的操作添加到 Undo Stack

 

 添加了一个函数后, 我们又删除了几个单词, IDE会向 Undo Stack Push 对应的操作

结下来,我们又调整了一下注释的缩进,IDEUndo Stack 也会记录相应的操作。向栈中添加元素的操作成为 Push。 最后加入的元素会放在栈顶

 

此时我们发现,之前编辑的函数有问题, 需要撤销之前的所有操作,此时最先撤销的时缩进调整的操作。 从栈中移除元素的操作称为 pop

 

接下来撤销的是 删除文字的操作

 

最后撤销的是添加函数的操作。 整个过程是按照LIFO顺序执行的

栈的实

可以使用Python list 来实现一个栈, 我们可以使用 list 中的 append 来替换栈中的Push。使用list pop方法来实现 从栈中按照LIFO的顺序移除数据的操作

也可以使用Python Collection模块中的 deque 来实现一个栈,调用的方法与Pythonlist完全一样   deque 是双端队列

 

还可以通过 queue. LifoQueue 来实现栈。 它提供了put() get() 方法,一个用于push数据, 另一个用于pop

from queue import LifoQueue
if  		name 	 == ' 	main 	':  myStack = LifoQueue()  myStack.put('a')
myStack.put('b')
myStack.put('c')  print(myStack.queue)  print(myStack.get())  print(myStack.queue)  print(myStack.get())  print(myStack.queue)

queue. LifoQueue listdeque 的区别. LifoQueue线程安全, list 线程不安全,deque 的append pop是线程安全的, 其余不安全

有效的括号(Leetcode 20)

如给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效 有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合

def isValid(s):
if len(s) % 2 == 1:
return False

pairs = {
")": "(",
"]": "[",
"}": "{",}

stack = list()
for ch in s:
if ch in pairs:
if not stack or stack[-1] != pairs[ch]:
return False  stack.pop()
else:
stack.append(ch)
return not stack

复杂度分析 :时间复杂度:O(n) 空间复杂度:O(n) 

最小栈(Leetcode 155)

如设计一个支持 push pop top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack :

MinStack() 初始化堆栈对象。

void push(int val) 将元素val推入堆栈。

void pop() 删除堆栈顶部的元素。

int top() 获取堆栈顶部的元素。

int getMin() 获取堆栈中的最小元素。

如设计一个支持 push pop top 操作,并能在常数时间内检索到最小元素的栈。

 什么是队

队列 (queue),是一种以先进先出的方式存取数据的数据结构FIFO First-In/First-Out

Queue 的特点类似一个管子, 我们从管子的一端放入元素, 从另一端取出元素。按照FIFO的方式排列元素,向队列中添加元素 的操作称为 Enqueue, 从队列中移除元素的操作称为 Dequeue

 

Python colletion模块中的 deque (double-ended queue) 可以借助deque (双端队列) 来实现队列

from collections import deque

if  		name 	 == ' 	main 	':  customers = deque()
# 开始排队 customers.append("Jane")  customers.append("John")  customers.append("Linda")  print(customers)
# 进场离队 print(customers.popleft())  print(customers)  print(customers.popleft())  print(customers)  print(customers.popleft())

数据流中的移动平均值 (Leetcode 346)

给定一个整数数据流和一个窗口大小,根据该滑动窗口的大小,计算其所有整数的移动平均值。 实现 MovingAverage 类:

MovingAverage(int size) 用窗口大小 size 初始化对象。

double next(int val) 计算并返回数据流中最后 size 个值的移动平均值。

 

思路 一: 利用数组/列表

class MovingAverage:
def 	init 	(self, size: int):  self.size = size  self.queue = []

def next(self, val: int) -> float:  size, queue = self.size, self.queue  queue.append(val)
# calculate the sum of the moving window  window_sum = sum(queue[-size:])

return window_sum / min(len(queue), size)

 思路 二: 利用队列

from collections import deque
class MovingAverage:
def 	init 	(self, size: int):  self.size = size  self.queue = deque()  self.window_sum = 0
self.count = 0	# 用来记录加进来多少元素

def next(self, val: int) -> float:  self.count += 1
# 向队列中加入数据
self.queue.append(val)
# 如果加入数据条目数>窗口大小, 队列移除队头数据
tail = self.queue.popleft() if self.count > self.size else 0  self.window_sum = self.window_sum - tail + val
return self.window_sum / min(self.size, self.count)

 用队列实现栈 (Leetcode 225)

请你仅使用两个队列实现一个后入先出LIFO的栈,并支持普通栈的全部四种操作(pushtoppop empty)  实现 MyStack 类:

void push(int x) 将元素 x 压入栈顶。

int pop() 移除并返回栈顶元素。

int top() 返回栈顶元素。

boolean empty() 如果栈是空的,返回 true ;否则,返回 false

滑动窗口最大值 (Leetcode 239)

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的

思路 一: 优先队列

优先队列:出队顺序与入队顺序无关,和优先级有关 普通队列:先进先出,后进后出

一般用最大堆/最小堆 来实现优先队列

Python中的heapq模块 实现了优先队列,可以借助该模块解决当前问题。

 

 滑动窗口最大值 (Leetcode 239)

思路 二: 单调递减队列

实际上没有必要维护一个长度为K的队列,我们的目标是获取最大值, 那么那些不可能成为窗口最大值的元素, 可以去掉

 

 为了方便判断队首元素与滑动窗口的位置关系,队列中保存的是对应元素的下标。

思路 二: 单调递减队列

思路 二: 单调递减队列 具体思路如:初始时单调队列为空,随着对数组的遍历过程中,每次插入中的

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

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

相关文章

四、Javaweb之Filter、Listener、Ajax、Vue

文章目录12. Filter 和 Listener12.1 Filter快速入门和执行流程12.2 Filter使用细节12.3 Filter案例:登录验证12.4 Listener13. AJAX13.1 AJAX快速入门13.2 AJAX案例13.3 Axios异步框架13.4 JSON13.5 JSON案例SelectAllServlet.javabrand.htmlAddServlet.javaaddBra…

某集团汽车配件电子图册性能分析案例(二)

背景 汽车配件电子图册系统是某汽车集团的重要业务系统。业务部门反映,汽车配件电子图册调用图纸时,出现访问慢现象。 某汽车集团总部已部署NetInside流量分析系统,使用流量分析系统提供实时和历史原始流量。本次分析重点针对汽车配件电子图…

JDBC简介及原理和使用介绍

JDBC简介及原理和使用介绍JDBC简介 jdbc概述 ​ Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。 …

WebGL-iTwin.js】实战篇(二):用nodejs代码详解iTwin.js中PhysicalObject生成方法

PhysicalObject 即真实存在的物理对象,比如:电脑、桌子等。在webgl中,我们人眼能看到的模型都是PhysicalObject,由多种几何图元类型构成,如:网格、实体、曲面、曲线,点云等。 其中带索引的多边…

XCTF:cat

打开是一个输入框,要求输入域名,尝试输入baidu.com进行测试 并无任何回显,测试下127.0.0.1本地地址 执行成功,并出现ping命令结果,这里很容易联想到命令注入,尝试进行命令拼接注入 但测试了常用的拼接字…

【5】变量和常量

一、什么是变量 首先我们要理解这么一个概念,在程序的运行过程中所有数据是保存在内存中的,我们代码中想使用这个数据的时候就要从内存中找,而变量的作用类似就是将内存地址保存,之后直接通过这个变量找内存中的数在Go语言中&…

JNI和Ndk开发

按照一下配置,基本能保证demo跑通 1、下载NDK,下载需要的版本 2、下载Cmake版本 3、项目结构:含C源码 4、编写JNI的加载类 public class YjkModel {static {System.loadLibrary("nativ"); //跟CMakeLists.txt 库名一致}public nat…

基于 APISIX 的服务网格方案 Amesh 积极开发中!

作者lingsamuel,API7.ai 云原生技术专家,Apache APISIX Committer。 在云原生快速发展的前提下,服务网格领域也开始逐渐火热。目前阶段,大家所熟知的服务网格解决方案很多,每种产品又各有其优势。因此在面对不同的行业…

python直接赋值、浅拷贝与深拷贝

本文主要参考这篇博文python浅拷贝与深拷贝 基本概念 首先了解python中的一些基本概念 变量:是一个系统表的元素,拥有指向对象的连接空间对象:被分配的一块内存,存储其所代表的值引用:是自动形成的从变量到对象的指…

ECU Extract + OS Task Mapping 步骤

纲要: 通过 Composition里面的Assembly Connection (Intra-ECU Communication)System Extract 里面的SystemDataMapping (Inter-ECU Communication) 已经把SWC的所有Data Element都连接上了,接下来就是把SWC的Runnable给Mapping到对应的OS Task上&…

(三)redis五大数据类型和key

目录 一、redis键(key)的常用操作 二、redis字符串(String) 1、简介 2、常用命令 3、数据结构 三、redis列表(List) 1、简介 2、常用命令 3、数据结构 四、redis集合(Set)…

Django(16):rest_framework框架使用指南

目录1.安装配置2.数据序列化2.1 Serializer2.2 ModelSerializer2.3 序列化对象的属性和方法3.请求和响应3.1 Request3.2 Response3.3 状态码3.4 as_view3.5 format_suffix_patterns3.6 示例4.CBV构建(基于类的视图)4.1 如何构建4.2 类型视图的扩展功能4.…

DMIPS, FLOPS, OPS概念

DMIPS DMIPS(Dhrystone Million Instructions executed Per Second):Dhrystone是测量处理器运算能力的最常见基准程序之一,常用于处理器的整型运算性能的测量。Dhrystone是一种整数运算测试程序。换句话说,就是使用Dhrystone这种程序在不同的…

【云原生 | 52】Docker三剑客之Docker Compose第三节

🍁博主简介: 🏅云计算领域优质创作者 🏅2022年CSDN新星计划python赛道第一名 🏅2022年CSDN原力计划优质作者 🏅阿里云ACE认证高级工程师 🏅阿里云开发者社区专…

FineReport填报报表

二次确认,删除行:参考: JS实现删除时二次确认- FineReport帮助文档 - 全面的报表使用教程和学习资料JS实现记录填报操作- FineReport帮助文档 - 全面的报表使用教程和学习资料确认后直接校验提交// 二次确认 var cell this.options.location…

开始安装Domino 12.0.2

大家好,才是真的好。 上周我们话题是NotesDomino12.0.2产品发布,主要说到了Domino12.0.2的新特性,新特性很多,要用很多篇来进行测试和说明。 今天我们主要谈谈Domino 12.0.2的系统要求和安装等。 首先,Domino12.0.2…

一、初识FreeRTOS之FreeRTOS简介

目录 一、什么是FreeRTOS? 二、为什么选择FreeRTOS? 三、FreeRTOS的特点 四、FreeRTOS资料与源码下载 五、FreeRTOS源码文件介绍 一、什么是FreeRTOS? Free即免费的,RTOS的全称是Real time operating system,中文就是实时操作…

python数据结构(一):字符串

一、字符串的格式化输出 1.1、格式化运算符 print("我跑完了第" str(lap 1) "圈")上面这段输出的代码使用了两个加号做了字符串拼接,并且将整形转换成了字符串。也可以使用一种更好的办法,格式化输出来打印这句话。 print(&quo…

xilinx srio ip学习笔记之再识srio

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 xilinx srio ip学习笔记之再识srio前言SRIO的理解IP核的理解前言 这段时间,随着对SRIO的学习,又有了更深的一点认识,不像一开始这么慌张了…

年终汇报工作,如何用项目管理工具展现成果

据报道,2022年11月20日的一次京东内部会议上,刘强东痛批京东中高层管理人员,表示部分高管醉心于 PPT 和奇妙词汇,或吹得天花乱坠但是执行一塌糊涂。 不可否认,刘强东提到的现象,的确是当今众多互联网大厂和…