文章目录

  • 125. 验证回文串
  • 232. 用栈实现队列
  • 239. 滑动窗口最大值

125. 验证回文串

  这里使用双端队列来解决回文串问题

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。

class Solution:def isPalindrome(self, s: str) -> bool:s = s.lower()# 检测字母与数字字符s = [i for i in s if i.isalpha() or i.isnumeric()]# 构造双端队列deque = collections.deque()# 回文词入对for i in s:deque.appendleft(i)state = Truewhile len(deque) > 1 and state:left = deque.popleft()right = deque.pop()if left != right:state = Falsereturn state

232. 用栈实现队列

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):
实现 MyQueue 类:
void push(int x) 将元素 x 推到队列的末尾
int pop() 从队列的开头移除并返回元素
int peek() 返回队列开头的元素
boolean empty() 如果队列为空,返回 true ;否则,返回 false
说明:
你只能使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。

解法一:在一个栈中维持所有元素的出队顺序思路

第一种方式是在一个栈中维持所有元素的出队顺序,即所有的元素在入队操作完成后只会保存在一个栈中,且其出栈的顺序和出队的顺序是一致的。通俗理解来说,相当于一个栈是中间容器

class MyQueue:def __init__(self):"""Initialize your data structure here."""self._s1,self._s2 = [],[]def push(self, x: int) -> None:"""Push element x to the back of queue."""# 为了维持栈1的出队顺序,当栈1中有元素,后续还要添加元素,需要先将栈1中的元素移到栈2,等栈1添加完之后,再将栈1的元素添加到栈1while self._s1:self._s2.append(self._s1.pop())self._s1.append(x)while self._s2:self._s1.append(self._s2.pop())def pop(self) -> int:"""Removes the element from in front of queue and returns that element."""return self._s1.pop()def peek(self) -> int:"""Get the front element."""return self._s1[-1]def empty(self) -> bool:"""Returns whether the queue is empty."""return self._s1 == []

解法二:一个栈入,一个栈出
思路:

解法二的实现方式与解法一有点不同,按照功能的不同,解法二将两个栈一个用于入队,—个用于出队。假设栈inStack 用于实现入队操作,栈outStack 用于实现出队操作。

class MyQueue:def __init__(self):"""Initialize your data structure here."""# self,_front用于存储入栈的栈首元素self._in_stack,self._out_stack,self._front = [],[],Nonedef push(self, x: int) -> None:"""Push element x to the back of queue."""# 保存入栈的栈首元素if not self._in_stack:self._front = xself._in_stack.append(x)def pop(self) -> int:"""Removes the element from in front of queue and returns that element."""if self.empty():raise Exception('The queue is empty!')# 将输入栈元素全部添加到输出栈if not self._out_stack:while self._in_stack:self._out_stack.append(self._in_stack.pop())return self._out_stack.pop()def peek(self) -> int:"""Get the front element."""if self.empty():raise Exception('The queue is empty!')if not self._out_stack:return self._frontelse:return self._out_stack[-1]def empty(self) -> bool:"""Returns whether the queue is empty."""return self._in_stack == [] and self._out_stack == []

239. 滑动窗口最大值

给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值

示例:

输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
输出: [3,3,5,5,6,7]
解释:
滑动窗口的位置 最大值


[1 3 -1] -3 5 3 6 7 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7

class Solution:def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:# 思路:利用单调队列性质与滑动窗口,构建滑动窗口内最大值的单调队列,这里存储的是下标,与存储元素一样n = len(nums)res = []# 双端队列q = collections.deque()for i in range(k):while q and nums[i] >= nums[q[-1]]:q.pop()q.append(i)# 构建了第一个窗口大小为k的单调队列,这里队列中存储的是下标,单调队列队首即为最大值对应的坐标res.append(nums[q[0]])for i in range(k,n):# 遍历元素大于单调队列末尾元素时,需要弹出,重新构建单调队列while q and nums[i] >= nums[q[-1]]:q.pop()q.append(i)# 当窗口不包含这个元素时,需要从单调队列中,从队首删除while q[0] <= i-k:q.popleft()res.append(nums[q[0]])return res
  • 时间复杂度:O(n),其中 n 是数组 nums的长度。每一个下标恰好被放入队列一次,并且最多被弹出队列一次,因此时间复杂度为 O(n)。
  • 空间复杂度:O(k)。与方法一不同的是,在方法二中我们使用的数据结构是双向的,因此「不断从队首弹出元素」保证了队列中最多不会有超过k+1 个元素,因此队列使用的空间为 O(k)。

如果对您有帮助,麻烦点赞关注,这真的对我很重要!!!如果需要互关,请评论或者私信!


leetcode—11.队列题型python解答相关推荐

  1. python解答蓝桥杯真题2 猜年龄 美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在19351936年应邀来中国清华大学讲学。。。

    python解答蓝桥杯真题2 猜年龄 美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学.他曾在1935~1936年应邀来中国清华大学讲学... 问题描述 全排列模板: 美国数学家维纳(N. ...

  2. 11.python解答2020年蓝桥杯省赛python组 寻找2020

    11.python解答2020年蓝桥杯省赛python组 寻找2020 问题描述 小蓝有一个数字矩阵,里面只包含数字 0 和 2.小蓝很喜欢 2020,他想找到这个数字矩阵中有多少个 2020 . 小 ...

  3. LeetCode 其他部分 简单 Python实现

    #LeetCode 其他部分 简单 Python实现 ''' 位1的个数 编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量).示例 : 输入: 11 ...

  4. 面试官系列 - LeetCode链表知识点题型总结

    文章目录 前言 知识点 什么是链表 类别 单向链表 循环链表 双向链表 双向循环链表 与数组的性能对比 优缺点 常用技巧 题型总结 基本操作 删除类 翻转类题型 合并链表 环形链表 拆分链表 排序链表 ...

  5. python解答蓝桥杯真题1 高斯日记 大数学家高斯有个好习惯:无论如何都要记日记。。。

    python解答蓝桥杯真题1 高斯日记 大数学家高斯有个好习惯:无论如何都要记日记... 题目标题: 高斯日记 大数学家高斯有个好习惯:无论如何都要记日记. 他的日记有个与众不同的地方,他从不注明年月 ...

  6. 计蒜客难题题库之一 泥塑课 python解答

    计蒜客挑战难题之一 泥塑课 python解答 题目: 小米是一个幼儿园老师,每学期的泥塑课上,她都会给每个学生发不超过250立方厘米的等量橡皮泥,教大家做泥塑.在上课过程中,她发现每个班都恰好有一个小 ...

  7. LeetCode 11. Container With Most Water--Java 解法--困雨水简单版

    LeetCode 11. Container With Most Water–Java 解法 此文首发于我的个人博客:LeetCode 11. Container With Most Water–Ja ...

  8. 计算机教资笔试答题,教资笔试5大题型的解答技巧,你get到了嘛?

    教师资格笔试中的题型主要涉及到选择题.简单题.辨析题.材料题以及写作题,以下就对于这几类常见的题型的解答技巧做一个简单的分析,希望能够给各位考生一些帮助. 1选择题 从内容上看,选择题涉及的多是重要知 ...

  9. python精通-11周精通python计划(完结)-网易云课堂

    微专业 11周精通python计划(完结) 课程概况 Python 语言是计算机工程.大数据及人工智能等领域的基础性语言,广泛且深刻地影响着信息技术各领域的发展方式及速度,从软件开发到硬件开发.从数据 ...

  10. LeetCode 11 Container With Most Water

    问题:给出一个数组nums,要求选择2个,使得容器中包含的水最多. 思路:假设选取x,y,其中x<y,则包含的水为min(x,y)*(index(y) - index(x)).此时应该选择在最小 ...

最新文章

  1. 微信小程序 java 传值_微信小程序传值获取值的实例方法
  2. C# 轻量级ORM 编写思维
  3. php上传手机文件到服务器,安卓上传文件至PHP服务器(示例代码)
  4. DNN架构解析(收集)
  5. ubuntu vim命令
  6. vertex 3.0 与SpringBoot混合开发之初探
  7. 进入到一个新的产品,如何开展测试工作
  8. python str转换成float
  9. MarkDown - Latex符号(箭头)的整理
  10. Nginx重写功能——location/rewrite
  11. sqlserver 2000 sp3补丁
  12. Bert模型(一)安装及问题解决(基本每一步都有问题)
  13. SQLServer2008 快捷键集合
  14. 美国计算机硕博连读最快几年,美国硕博连读要几年?哪些大学开设?
  15. 知乎:面朝大海,春暖花开!
  16. 五十二.用户配额管理 云主机类型管理 、 镜像管理 网络管理 案例和实例管理 、 安装额外计算节点...
  17. django使用Q进行复杂查询
  18. SQL面试中的常见问题
  19. C++ | ListNode:链表节点
  20. 互联网+废品回收项目概要设计说明书

热门文章

  1. SQL安装过程中安装程序挂起问题解决
  2. Altium Designer(九):DXF+DWG
  3. LSTMs和递归神经网络的初学者指南
  4. Software--Spring Boot--Contact 项目初期
  5. JS+dom简单运动实现
  6. ASP.NET长文章分页
  7. MSE(Media Source Extensions)介绍
  8. 使用hiredis接口(Synchronous API)编写redis客户端
  9. python编程快速上手
  10. Linux性能优化之内存优化(二)