剑指offer刷题(栈、堆、 队列、 图)
Stack & Queue
005-用两个栈实现队列
题目描述
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 push 和 pop ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
题解
用两个栈来实现队列(先进先出)的功能
stack1:实现
push操作
- 直接添加到stack1中stack2:实现
pop操作
1. stack1和Stack2 均而空,返回 -1;
2.若 stack2 为空(有上面条件知stack1不为空)
- 遍历stack1,将stack1中的元素添加到stack2中
3.只要stack2不为空,弹出stack2栈顶的元素;
代码
import java.util.Stack;
public class Solution {
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
//push 是从队列的头部插入元素
public void push(int node) {
stack1.add(node);
}
// pop() 是从队列的尾部取出元素
public int pop() {
if(stack1.isEmpty() && stack2.isEmpty()){
return -1;
}
if(stack2.isEmpty()){
while(!stack1.isEmpty()){
stack2.push(stack1.pop());
}
}
return stack2.pop();
}
}
复杂度
由于问题特殊,以下分析仅满足添加 N 个元素并删除 N 个元素,即栈初始和结束状态下都为空的情况。
时间复杂度: push函数为 O(1);pop()函数在N次队首元素删除操作中总共需完成N个元素的倒序。
空间复杂度O(N):最差情况下,栈1和2共保存N个元素。
020-包含min函数的栈021-栈的压入、弹出序列
题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.min(); --> 返回 -2.
题解
知识点:
- dd & push
共同点:
add,push都可以向stack中添加元素。不同点:
`add`是继承自Vector的方法,且返回值类型是boolean. `push`是Stack自身的方法,返回值类型是参数类类型。
- peek & pop
共同点:peek,pop都是返回栈顶元素。
不同点:
peek()函数返回栈顶的元素,但不弹出该栈顶元素。
pop()函数返回栈顶的元素,并且将该栈顶元素出栈。
函数设计:
- push(x) 函数: 重点为保持栈 B 的元素是 非严格降序 的。
将 x 压入栈 A(即 A.add(x) );
若 ① 栈 B 为空 或 ② x 小于等于 栈 B 的栈顶元素,则将 x 压入栈 B (即 B.add(x) )。
- pop() 函数: 重点为保持栈 A,B 的 元素一致性 。
- 执行栈 A 出栈(即 A.pop() ),将出栈元素记为 y ;
- 若 y等于栈 B 的栈顶元素,则执行栈 B 出栈(即 B.pop() )。
top() 函数: 直接返回栈 A 的栈顶元素即可,即返回 A.peek() 。
min() 函数: 直接返回栈 B 的栈顶元素即可,即返回 B.peek() 。
代码
class MinStack {
Stack<Integer> stack;//c存储数据
Stack<Integer> stackMin;//存储最小值
/** initialize your data structure here. */
public MinStack() {
stack = new Stack<>();
stackMin = new Stack<>();
}
public void push(int x) {
stack.push(x);//将x压入存储栈stack中;
//当stackMin为空或者当前x小于栈顶元素(x为最小值);将x压入栈stackMIn中;
if(stackMin.isEmpty() ||x <= stackMin.peek()) stackMin.push(x);
}
public void pop() {
//stack.pop()实现了出栈操作;
//stackMin的栈顶元素 == stack的栈顶元素,说明最小值是最后进栈的,也需要出栈;
if(stack.pop().equals(stackMin.peek())) stackMin.pop();
}
public int top() {
return stack.peek();
}
public int min() {
return stackMin.peek();
}
}
复杂度
- 时间复杂度 O(1): push(), pop(), top(), min() 四个函数的时间复杂度均为常数级别。
- 空间复杂度 O(N) : 当共有 N 个待入栈元素时,辅助栈 B 最差情况下存储 N个元素,使用 O(N) 额外空间。
044-翻转单词顺序列(栈)
题目描述
题解
代码
复杂度
064-滑动窗口的最大值(双端队列)
题目描述
题解
代码
复杂度
Heap
029-最小的K个数
题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。
示例1
输入
[4,5,1,6,2,7,3,8],4
返回值
[1,2,3,4]
题解
法一:大根堆(前 K 小) / 小根堆(前 K 大),Java中有现成的 PriorityQueue.
- 默认是小根堆,实现大根堆需要重写一下比较器。
PriorityQueue<Integer> queue = new PriorityQueue<>((o1,o2) -> o2-o1);

代码
import java.util.ArrayList;
import java.util.PriorityQueue;
public class Solution {
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
if(input.length < k || k < 1) return new ArrayList<>();
//默认是小根堆,实现大根堆需要重写一下比较器
PriorityQueue<Integer> queue = new PriorityQueue<>((o1,o2) -> o2-o1);
//遍历数组
for(int num : input){
//近小顶堆填满
if(queue.size() < k){
queue.add(num);
}
//小顶堆的堆顶为最大值,若遍历的数小于堆顶,将堆顶元素替换
if(queue.size() >= k && queue.peek() > num){
queue.poll();
queue.add(num);
}
}
return new ArrayList<>(queue);
}
}
复杂度
- 时间复杂度: O(NlogK)
- 空间复杂度: O(K)
Hash Table
034-第一个只出现一次的字符
题目描述
题解
代码
复杂度
图
065-矩阵中的路径(BFS)
题目描述
题解
代码
复杂度
066-机器人的运动范围(DFS)
题目描述
题解
代码
复杂度
剑指offer刷题(栈、堆、 队列、 图)的更多相关文章
- 剑指Offer——Java实现栈和队列的互模拟操作
剑指Offer--Java实现栈和队列的互模拟操作 栈模拟队列 题目:JAVA实现用两个栈来实现一个队列,完成队列的Push和Pop操作.队列中的元素为int类型. 思路:其实就是把队列正常入 ...
- 剑指offer刷题
1.面试题43. 1-n整数中1出现的次数 输入一个整数 n ,求1-n这n个整数的十进制表示中1出现的次数. 例如,输入12,1-12这些整数中包含1 的数字有1.10.11和12,1一共出现了5次 ...
- 牛客网剑指offer刷题总结
二维数组中的查找: 题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 两 ...
- 剑指offer刷题(Tree)
开篇 二刷剑指offer了,本来用Tyora记的笔记,发现字数到四万了就变得好卡o(╥﹏╥)o,刚好开始写博客,就转过来吧,记下来子自己看.不废话,开刷... JZ26. 树的子结构 输入两棵二叉树A ...
- LeetCode剑指Offer刷题总结(一)
LeetCode过程中值得反思的细节 以下题号均指LeetCode剑指offer题库中的题号 本文章将每周定期更新,当内容达到10题左右时将会开下一节. 二维数组越界问题04 public stati ...
- 剑指offer ------ 刷题总结
面试题3 -- 搜索二维矩阵 写出一个高效的算法来搜索 m × n矩阵中的值. 这个矩阵具有以下特性: 1. 每行中的整数从左到右是排序的. 2. 每行的第一个数大于上一行的最后一个整数. publi ...
- 剑指offer刷题记录
目录 二维数组中的查找 替换空格 从尾到头打印链表 反转链表 重建二叉树 用两个栈实现队列 旋转数组的最小数字 斐波拉切数列 跳台阶 变态跳台阶 矩形覆盖 二进制中1的个数 数值的整次方 链表中倒数第 ...
- 剑指offer刷题笔记
删除链表中重复的结点:较难 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4- ...
- 剑指offer刷题总结
★ 二维数组的查找 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否 ...
随机推荐
- Jmeter之参数化函数助手__randomstring
1.Tools->函数助手对话框,选择__Random String,2表示随机生成的字符长度:3表示从哪些字符中随机生成:然后点击生成,得到对应的变量: 5中372表示该函数随机生成的字符串, ...
- 纯JS自定义网页滚动条
前言 由于最近在公司很忙,没什么时间更新,忙中抽时间做了一个JS滚动条,因为火狐浏览器与谷歌浏览器的滚动条自定义样式过于麻烦,所以我打算自己写个方便改样式的滚动条 CSS <style> ...
- CDH+Kylin三部曲之二:部署和设置
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- The path "" is not a valid path to the 3.10.0-957.el7.x86_64 kernel headers.
安装 kernel-devel yum install kernel-devel-$(uname -r)
- 《SQL 必知必会》读书笔记
第1课 了解 SQL 这章主要介绍了数据库,表,字段类型,行,列,主键和SQL等基本概念. 数据库:以某种形式存储的数据集合,在计算机上的表现形式可能是一个文件或者一组文件.我们平时所说的数据库,往往 ...
- Java面试题集(一)问题清单
java基础篇: 1.1.Java基础 (1)面向对象的特性:继承.封装和多态 (2)final.finally.finalize 的区别 (3)Exception.Error.运行时异常与一般异常有 ...
- sqlServer数据库中的日期转换
今天开发过程中涉及到 sqlServer数据库数据同步至mysql数据,所以对日期格式转换需求,查到了一些关于sqlServer 的日期转换内容: 一般存入数据库中的时间格式为yyyy-mm-ddhh ...
- Spring Boot学习笔记(一)——Eclipse安装STS插件
一.简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式进行配置,从而使开发人员不再需要定义样板化的配 ...
- PowerDesigner 概念数据模型(CDM)
大 中 小 PowerDesigner 概念数据模型(CDM) 说明 2014-05-07 大数据深... 来源 阅 51 转藏到我的图书馆 微信 分享: QQ空间 QQ好友 新 ...
- DTU连接不稳定有什么办法
DTU是一种物联网的终端设备,在工业信息化的不断推进的大背景下,DTU的市场需求也越来越大,本身具有网络覆盖范围广.资费低.数据传输准确及时等众多优点.但在使用的过程中DTU会出现很多问题,比如DTU ...