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. 1-JAVA类、接口、抽象、多态

    类中全部成员变量用priviate修饰,用get获取,set设值 对于boolean类型的值,getter方法也一定要写成isXXX 的形式,而setXXX类型不变 this关键字的作用 当方法的局部 ...

  2. 适合刚刚学习编程的萌新:C语言编程学习制作超简单又好玩的报数游戏!

    C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...

  3. sql server 2008 r2 直接下载地址,可用迅雷下载

    sqlserver 2008 r2 直接下载地址,可用迅雷下载 下载sqlserver 2008 r2 ,微软用了一个下载器,经过从下载器上,将他的地址全部用键盘敲了下来.最终的简体中文版地址如下: ...

  4. Anderson《空气动力学基础》5th读书笔记 第4记——黏性流动入门

    目录 一.边界层的概念 二.边界层的产生原因 三.剪切力的公式 四.温度分布情况 五.雷诺数与层流.湍流 一.边界层的概念 我们先来介绍边界层的概念(边界层正是黏性流动的产物),边界层是紧挨物体的薄层 ...

  5. codevs1298, hdu1392 (凸包模板)

    题意: 求凸包周长. 总结: 测试模板. 代码: #include <iostream> #include <cstdio> #include <cstring> ...

  6. 理解DES算法

    首先 了解对称密码加密技术:采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密.但是有时候密钥不用完全相同 只要相似也可以.因为用一个密钥可 ...

  7. service下载任务

    在service开启线程,利用接口更新进度 public class MainActivity extends AppCompatActivity { MyBindService msgService ...

  8. Redis学习笔记(五)——数据结构之哈希(Hash)

    一.介绍 Redis hash是一个string类型的field和value的映射表,hash特别设于用于存储对象. Redis中每个hash可以存储232 - 1 键值对(40多亿). 基本命令: ...

  9. 使用js模拟点击,点击a链接 $("#abc ").click(); 无效的解决方案

    摘要: 问题分析 点击A标签本身,并不会触发跳转到指定链接的事件,就是说,我们平时都是点击的A标签中的文字了. 所以要想用JS模拟点击A标签事件,就得先往A标签中的文字添加能被JS捕获的元素,然后再用 ...

  10. Reading Face, Read Health论文阅读笔记

    摘要: 随着计算技术觉.人工智能和移动技术的发展,利用计算机读脸技术去识别每个人每天的健康是可行的.怎么去设计一个基于FRT(face reading technologies)的用于得到每天的保健实 ...