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

共同点:addpush都可以向stack中添加元素。

不同点:

`add`是继承自Vector的方法,且返回值类型是boolean.

`push`是Stack自身的方法,返回值类型是参数类类型。
  • peek & pop

共同点:peek,pop都是返回栈顶元素。

不同点:

peek()函数返回栈顶的元素,但不弹出该栈顶元素。
pop()函数返回栈顶的元素,并且将该栈顶元素出栈。

函数设计

  • push(x) 函数: 重点为保持栈 B 的元素是 非严格降序 的。
  1. 将 x 压入栈 A(即 A.add(x) );

  2. 若 ① 栈 B 为空 或 ② x 小于等于 栈 B 的栈顶元素,则将 x 压入栈 B (即 B.add(x) )。

  • pop() 函数: 重点为保持栈 A,B 的 元素一致性 。
  1. 执行栈 A 出栈(即 A.pop() ),将出栈元素记为 y ;
  2. 若 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刷题(栈、堆、 队列、 图)的更多相关文章

  1. 剑指Offer——Java实现栈和队列的互模拟操作

    剑指Offer--Java实现栈和队列的互模拟操作 栈模拟队列   题目:JAVA实现用两个栈来实现一个队列,完成队列的Push和Pop操作.队列中的元素为int类型.   思路:其实就是把队列正常入 ...

  2. 剑指offer刷题

    1.面试题43. 1-n整数中1出现的次数 输入一个整数 n ,求1-n这n个整数的十进制表示中1出现的次数. 例如,输入12,1-12这些整数中包含1 的数字有1.10.11和12,1一共出现了5次 ...

  3. 牛客网剑指offer刷题总结

    二维数组中的查找: 题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 两 ...

  4. 剑指offer刷题(Tree)

    开篇 二刷剑指offer了,本来用Tyora记的笔记,发现字数到四万了就变得好卡o(╥﹏╥)o,刚好开始写博客,就转过来吧,记下来子自己看.不废话,开刷... JZ26. 树的子结构 输入两棵二叉树A ...

  5. LeetCode剑指Offer刷题总结(一)

    LeetCode过程中值得反思的细节 以下题号均指LeetCode剑指offer题库中的题号 本文章将每周定期更新,当内容达到10题左右时将会开下一节. 二维数组越界问题04 public stati ...

  6. 剑指offer ------ 刷题总结

    面试题3 -- 搜索二维矩阵 写出一个高效的算法来搜索 m × n矩阵中的值. 这个矩阵具有以下特性: 1. 每行中的整数从左到右是排序的. 2. 每行的第一个数大于上一行的最后一个整数. publi ...

  7. 剑指offer刷题记录

    目录 二维数组中的查找 替换空格 从尾到头打印链表 反转链表 重建二叉树 用两个栈实现队列 旋转数组的最小数字 斐波拉切数列 跳台阶 变态跳台阶 矩形覆盖 二进制中1的个数 数值的整次方 链表中倒数第 ...

  8. 剑指offer刷题笔记

    删除链表中重复的结点:较难 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4- ...

  9. 剑指offer刷题总结

    ★ 二维数组的查找 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否 ...

随机推荐

  1. 晋城6397.7539(薇)xiaojie:晋城哪里有xiaomei

    晋城哪里有小姐服务大保健[微信:6397.7539倩儿小妹[晋城叫小姐服务√o服务微信:6397.7539倩儿小妹[晋城叫小姐服务][十微信:6397.7539倩儿小妹][晋城叫小姐包夜服务][十微信 ...

  2. 多Y轴图的尝试

    最近的一篇文章中需要绘制多Y轴图形,Excel只能做双Y轴图,又尝试了Origin,SigmaPlot,Igor等软件,手动做起来相当繁琐,批量做更是觉得费劲,干脆尝试在MeteoInfoLab里实现 ...

  3. 拦截导弹简单版——线性dp

    题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...

  4. git tag的应用

    一,git的tag是什么? tag就是给commit起一个容易记忆容易理解的名字 说明:架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectfores ...

  5. pycharm2018.1下载激活(mac平台)

    此教程实时更新,请放心使用:如果有新版本出现猪哥都会第一时间尝试激活: pycharm官网下载地址:http://www.jetbrains.com/pycharm/download/ 激活前准备工作 ...

  6. Mac安装stf

    1.brew install rethinkdb graphicsmagick zeromq protobuf yasm pkg-config 2.node版本8.x我的是8.15.0 3.npm i ...

  7. 1. Deep Q-Learning

    传统的强化学习算法具有很强的决策能力,但难以用于高维空间任务中,需要结合深度学习的高感知能力,因此延展出深度强化学习,最经典的就是DQN(Deep Q-Learning). DQN 2013 DQN的 ...

  8. Redis【二】 set|get那些事

    redis4.0.9 SET\GET方法 从哪里开始 server.c里面有每个redis命令对应的执行方法 如 struct redisCommand redisCommandTable[] = { ...

  9. 「MCOI-03」村国题解

    第二篇题解! 可能是退役之前的最后一篇题解了 (好像总共都只写了两篇) 不说了,讲题: 题面 题意: 有T个数据 有一颗树(保证所有的的节点都是相连的),有n个节点,每个节点都有相应的权值与序号,现在 ...

  10. 【Jmeter】设置语言为中文

    1.临时设置 Jmeter菜单栏选择Options-Choose Language-Chinese (Simplified) 这种方法,重启软件后又变为英文环境了. 2.永久设置 进入apache-j ...