目录

JZ9 用两个栈实现队列

JZ30 包含min函数的栈

JZ31 栈的压入、弹出序列

JZ73 翻转单词序列

JZ59 滑动窗口的最大值


JZ9 用两个栈实现队列

思路(蓄水池):创建两个栈,入栈时先入栈一,出栈时,先检测栈二是否为空,若为空,将栈一所有元素全部弹出并压入栈二,若不为空,则直接将栈二元素弹出即可。

以下链接是博主早已整理出画图理解,包括两个栈如何实现队列?两个队列如何实现栈?快来看看吧!

http://t.csdn.cn/vyc3o

    Stack<Integer> stack1 = new Stack<Integer>();Stack<Integer> stack2 = new Stack<Integer>();public void push(int node) {if(stack2.isEmpty()){stack1.push(node);}else{while(!stack2.isEmpty()){stack1.push(stack2.pop());}stack1.push(node);}}public int pop() {int ret = 0;if(!stack2.isEmpty()){ret = stack2.pop();}else{while(!stack1.isEmpty()){stack2.push(stack1.pop());}ret = stack2.pop();}return ret;}

JZ30 包含min函数的栈

思路(此题是头条的笔试题):建立两个栈,一个是主栈,一个是最小栈,每次压栈主栈都会进行压栈,而最小栈只有为空或是压栈元素小于最小栈栈顶元素即可;出栈时主栈每次必须出栈并在出栈时检测是否与最小栈栈顶元素相等,若相等则一起弹出,若不相等,则不用弹出~

    Stack<Integer> stack = new Stack<>();Stack<Integer> minStack = new Stack<>();public void push(int node) {//最小栈为空直接放数据if(minStack.isEmpty()){minStack.push(node);}else if(minStack.peek() >= node){//小于等于最小栈栈顶元素都要放入minStack.push(node);}//主栈必须放stack.push(node);}public void pop() {//检测主栈元素是否等于最小栈栈顶元素,若等于也需要pop//这里要注意pop和peek操作返回的都是泛型类,没有整数比较时需要强制类型转化if((int)stack.pop() == (int)minStack.peek()){minStack.pop();}}public int top() {return stack.peek();}public int min() {return minStack.peek();}

JZ31 栈的压入、弹出序列

思路:创建一个栈,将所给入栈序列一个一个入栈,同时将每个入栈元素与弹出序列的元素进行比较,若相等就弹出,不相等则继续压栈,往复操作,直到遍历完为止

    public boolean IsPopOrder(int [] pushA,int [] popA) {Stack<Integer> stack = new Stack<>();int count = 0;//计数:与压栈数据匹配则加一for(int i = 0; i < pushA.length; i++){if(pushA[i] == popA[count]){//先压栈,再判断stack.push(pushA[i]);while(stack.peek() == popA[count]){stack.pop();count++;//popA遍历完说明正确if(count == pushA.length){return true;}/***弹出栈后,可能一个元素也不剩,这时再到while里判断,*有可能能造成对空指针的解引用操作*/if(stack.empty()){break;}}}else{stack.push(pushA[i]);}}return false;}

JZ73 翻转单词序列

此题给出了进阶要求:空间复杂度 O(n) ,时间复杂度 O(n) ,栈解决依然符合要求

思路:先将所给字符串分割放入数组中,创建一个栈,直接压栈出栈即可得到反转单词(注意空格),是不是很妙~

    public String ReverseSentence(String str) {Stack<String> stack = new Stack<>();//每个单词用空格分开String[] strArr = str.split(" ");StringBuilder ret = new StringBuilder();//压栈for(int i = 0; i < strArr.length; i++){//注意空格隔开if(i != 0){stack.push(" ");}stack.push(strArr[i]);}//出栈while(!stack.isEmpty()){ret.append(stack.pop());}return ret.toString();}

JZ59 滑动窗口的最大值

解法一(双指针法,若不考虑时间复杂度,则可以通过):通过双指针来维护滑动窗口,并且每次遍历小的滑动窗口,比较出最大值后放入顺序表,往复操作即可~

    public ArrayList<Integer> maxInWindows(int [] num, int size) {ArrayList<Integer> array = new ArrayList<>();//假定最大值for(int i = 0; i < num.length - size + 1; i++){int left = i;int right = left + size - 1;//求最大值int max = num[left];//假定最大值for(int j = left; j <= right; j++){if(num[j] > max){max = num[j];}}array.add(max);}return array;}

解法二(双端队列):创建一个双端队列,保持对头存放数组最大值下标,窗口滑动每滑动一次,就要判断当前最大值是否还是真的最大值,同时新增元素从队尾开始比较,比他小的全部出队,往复操作即可~

    public static ArrayList<Integer> maxInWindows(int [] num, int size){ArrayList<Integer> array = new ArrayList<>();//长度为零直接返回空表if(size == 0) {return array;}int begin = 0;//双端队列用来存放下标Deque<Integer> deque = new LinkedList<>();for(int i = 0; i < num.length; i++){//制造虚拟滑动窗口起点begin = i - size + 1;//若为空,先放入元素假定为最大值if(deque.isEmpty()){deque.add(i);}else if(begin > deque.peekFirst()){deque.pollFirst();}//队尾开始比较,把比他小的都出队while((!deque.isEmpty()) && num[deque.peekLast()] <= num[i]){deque.pollLast();}deque.add(i);if(begin >= 0){array.add(num[deque.peekFirst()]);}}return array;}

《剑指Offer》栈队列全题——妙解思路,难度由浅入深相关推荐

  1. 《剑指Offer》Java刷题 NO.36 两个链表的第一个公共结点(链表,等长拼接法,长者先行法,辅助栈)

    <剑指Offer>Java刷题 NO.36 两个链表的第一个公共结点(链表,等长拼接法,长者先行法,辅助栈) 传送门:<剑指Offer刷题总目录> 时间:2020-06-19 ...

  2. java queue 最大值_[剑指offer题解]队列的最大值/滑动窗口的最大值

    前言 众所周知,<剑指offer>是一本"好书". 为什么这么说? 因为在技术面试中,它里面罗列的算法题在面试中出现的频率是非常非常高的. 有多高,以我目前不多的面试来 ...

  3. 《剑指 Offer I》刷题笔记 11 ~ 19 题

    <剑指 Offer I>刷题笔记 11 ~ 19 题 查找算法(中等) 11. 二维数组中的查找 _解法 1:暴力迭代 解法 2:标志数 解法 3:逐行二分 12. 旋转数组的最小数字 _ ...

  4. 《剑指 Offer I》刷题笔记 1 ~10 题

    <剑指 Offer I>刷题笔记 1 ~10 题 栈与队列(简单) 1. 用两个栈实现队列 _解法 1:暴力做法 解法 2:优化解法 1 2. 包含 min 函数的栈 _解法 1:pop( ...

  5. 牛客网剑指offer编程实践1-10题

    牛客网剑指offer编程实践1-10题 1.二维数组中的查找 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这 ...

  6. 《剑指 Offer I》刷题笔记 41 ~ 50 题

    <剑指 Offer I>刷题笔记 41_50 排序(中等) 41. 最小的k个数# _解法1:排序 API + 数组复制 API 42. 数据流中的中位数 _解法1:暴力 搜索和回溯算法( ...

  7. 【剑指Offer】俯视50题之31 - 40题

    [剑指Offer]俯视50题之31 - 40题 面试题31连续子数组的最大和 面试题32从1到n整数中1出现的次数 面试题33把数组排成最小的数 面试题34丑数 面试题35第一个仅仅出现一次的字符 面 ...

  8. 《剑指 Offer I》刷题笔记 51 ~ 61 题

    <剑指 Offer I>刷题笔记 51_60 位运算(简单) 51. 二进制中 1 的个数 _解法1:逐伟判断 解法2:巧用 n&(n-1) 52. 不用加减乘除做加法(背题) 解 ...

  9. 《剑指 Offer I》刷题笔记 20 ~ 30 题

    <剑指 Offer I>刷题笔记 20_30 动态规划(简单) 20. 斐波那契数列 _解法1:迭代 解法2:记忆化递归 解法3:动态规划 21. 青蛙跳台阶问题 _解法1:动态规划 22 ...

最新文章

  1. matlab 全员极大型Topsis评价代码
  2. angular1x初始与架构演进(三)Ui-Router+OcLazyLoad加载模块
  3. python基础教程书籍推荐-Python大神推荐给小白的36本入门书籍
  4. python进展_Python3的介绍和进展-“filter()”“time()”和decorator。,入门,与,进阶,filtertime,装饰,器...
  5. jQuery实现下拉列表移动 效果
  6. android弹球动画,Android动画之自定义Evaluator实现弹球效果
  7. ASP.NET没有魔法——开篇-用VS创建一个ASP.NET Web程序
  8. sparkR介绍及安装
  9. JavaScript之函数实例属性和类属性
  10. linux缺页异常处理--内核空间
  11. 添加内核驱动模块(5)(mydriver.c+ Konfig+Makefile )
  12. linux读取bmp图片数据,linux下读取bmp图片文件头
  13. JAVA Signal Handing
  14. Word插入题注优化(自动删除标签与编号前的空格,编号后添加空格)
  15. blender中旋转问题(A绕B的中心旋转)
  16. python: 解决SyntaxError: encoding problem
  17. 第二十九章 OOTV杯超级模式大赛-模式总结(读书笔记)
  18. 台式机系统安装成功之后,官网下载,安装台式机主板最匹配的官网驱动
  19. 教育已成中国人不折不扣的国耻
  20. Mac那些好用的软件(持续更新)

热门文章

  1. zcmu 1143: 又是比智力
  2. stack expects each tensor to be equal size, but got [3, 224, 224] at entry 0 and [1,224,224] at entr
  3. GLC - 实现 glog 日志清理
  4. 利用3D绘图程序Pangolin显示文本信息
  5. 【Flink实战系列】为什么我的Flink任务正常运行,UI上却不显示接收和发送的数据条数呢?
  6. Kubernetes CKA认证运维工程师笔记-Kubernetes监控与日志
  7. java cv bgr2gray_OpenCV color_bgr2gray错误
  8. linux环境用usb麦克风阵列ALSA音频设备录音
  9. Python 办公自动化,全网最全整理来了
  10. 基于机智云和ShineBlink的智能加湿器方案