2018-11-16 22:45:48

一、单调队列 Monotone Queue

  • 239. Sliding Window Maximum

问题描述:

问题求解:

本题是一个经典的可以使用双端队列或者说单调队列完成的题目,具体来说,就是通过双端队列将可能的最大值维护起来。

    public int[] maxSlidingWindow(int[] nums, int k) {
if (nums == null || nums.length < k || k == 0) return new int[0];
Deque<Integer> q = new LinkedList<>();
int[] res = new int[nums.length - k + 1];
for (int i = 0; i < nums.length; i++) {
while (!q.isEmpty() && q.getLast() < nums[i]) q.pollLast();
q.addLast(nums[i]);
if (i >= k - 1) {
res[i - k + 1] = q.getFirst();
if (q.getFirst() == nums[i - k + 1]) q.pollFirst();
}
}
return res;
} 

  

二、单调栈 Monotone Stack

什么是Monotonic Stack?

答:从栈顶到栈底是按照单调顺序排列的。

  • 739. Daily Temperatures

问题描述:

问题求解:

维护一个从栈顶到栈底单调递增的栈。

从末尾向前遍历,如果当前的数值比栈顶的数值要大的话,那么显然更小的数值是不再需要的了,直接pop即可。

    public int[] dailyTemperatures(int[] T) {
int[] res = new int[T.length];
Stack<int[]> stack = new Stack<>();
for (int i = T.length - 1; i >= 0; i--) {
while (!stack.isEmpty() && stack.peek()[0] <= T[i]) stack.pop();
res[i] = stack.isEmpty() ? 0 : stack.peek()[1] - i;
stack.push(new int[]{T[i], i});
}
return res;
}
  • 1019. Next Greater Node In Linked List

问题描述:

问题求解:

    public int[] nextLargerNodes(ListNode head) {
List<Integer> nums = new ArrayList<>();
for (ListNode cur = head; cur != null; cur = cur.next) {
nums.add(cur.val);
}
int[] res = new int[nums.size()];
Stack<Integer> stack = new Stack<>();
for (int i = nums.size() - 1; i >= 0; i--) {
while (!stack.isEmpty() && stack.peek() <= nums.get(i)) stack.pop();
res[i] = stack.isEmpty() ? 0 : stack.peek();
stack.push(nums.get(i));
}
return res;
}
  • 901. Online Stock Span

问题描述:

问题求解:

public class StockSpanner {
Stack<int[]> stack;
int idx; public StockSpanner() {
stack = new Stack<>();
stack.push(new int[]{Integer.MAX_VALUE, -1});
idx = 0;
} public int next(int price) {
while (stack.peek()[1] <= price) stack.pop();
int res = idx - stack.peek()[1];
stack.push(new int[]{price, idx});
idx++;
return res;
}
}

  

  

单调队列 Monotonic Queue / 单调栈 Monotonic Stack的更多相关文章

  1. C++ 队列(queue)堆栈(stack)实现基础

    Queue 在C++中只要#include<queue>即可使用队列类,其中在面试或笔试中常用的成员函数如下(按照最常用到不常用的顺序) 1. push 2. pop 3. size 4. ...

  2. zjnu1735BOB (单调队列,单调栈)

    Description Little Bob is a famous builder. He bought land and wants to build a house. Unfortunately ...

  3. 单调栈&单调队列入门

    单调队列是什么呢?可以直接从问题开始来展开. Poj 2823 给定一个数列,从左至右输出每个长度为m的数列段内的最小数和最大数. 数列长度:\(N <=10^6 ,m<=N\) 解法① ...

  4. 单调栈and单调队列(此文太多坑了,以后再填)

    单调栈 单调栈是一种特殊的栈,特殊之处在于栈内的元素都保持一个单调性,可能为单调递增,也可能为单调递减. 性质: 单调栈里的元素具有单调性 元素加入栈前,会在栈顶端把破坏栈单调性的元素都删除 使用单调 ...

  5. [数据结构]——链表(list)、队列(queue)和栈(stack)

    在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...

  6. 单调队列&单调栈

    单调队列 例题: Poj 2823给定一个数列,从左至右输出每个长度为m的数列段内的最小数和最大数.数列长度:N<=106,m<=N 对于单调队列,我们这样子来定义: 1.维护区间最值 2 ...

  7. HDU 4123(树的直径+单调队列)

    Bob’s Race Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  8. 1126. Magnetic Storms(单调队列)

    1126 最简单的单调队列应用吧 单调队列是指在一个队列中各个元素单调 递增(或者递减),并且各个元素的下标单调 递增. 单调队列的大体操作 进队时,将进队的元素为e,从队尾往前扫描,直到找到一个不大 ...

  9. 算法笔记--单调队列优化dp

    单调队列:队列中元素单调递增或递减,可以用双端队列实现(deque),队列的前面和后面都可以入队出队. 单调队列优化dp: 问题引入: dp[i] = min( a[j] ) ,i-m < j ...

随机推荐

  1. BootstrapTable(附源码)

    Bootstrap结合BootstrapTable的使用,分为两种模试显示列表. 引用的css: <link href="@Url.Content("~/Css/bootst ...

  2. (4opencv)对OpenCV中“旋转”的思考和实验

    ​    我记得曾经有人对OpenCV的旋转吐槽,意思是它自己没有很好的关于选择的算法.在新的版本里面添加了这些函数(我还没有时间去看是什么时候pr的).现在一个比较棘手的问题,就是OpenCV中旋转 ...

  3. 20145212 罗天晨 Web安全基础实践

    一.实验后回答问题 (1)SQL注入攻击原理,如何防御 原理:SQL注入攻击是攻击者在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,把SQL语句当做用户名等输入正常网页中以获取数据 ...

  4. CentOS 7 install slurm cluster

    //slurm install //CentOS 7 system //192.168.159.141 node01 //192.168.159.142 node02 systemctl stop f ...

  5. 标签无效 "/zabbix_export/date": "YYYY-MM-DDThh:mm:ssZ" 预计。

    Centos7.5 使用导入percona模板的时候报错 百度给的解决方案是 将zabbix_agent_template_percona_mysql_server_ht_2.0.9-sver1.1. ...

  6. Oracle SQL——inner jion;left join;right join的区别和使用场景

    背景 在一次面试的时候,面试官让我说一下这三者的使用场景和区别,当时瞬间懵逼,哈哈.回来赶快看一看,记下来. 详解 inner join 等值查询:返回两张表中,联结字段值相等的组合记录 举例:所有学 ...

  7. uniGUI试用笔记(二)

    前几天做的demo今天启动后,浏览器打开页面后死活不显示窗体,找了半天原因才发现是360浏览器启动了兼容模式,改成极速模式后就正常了.有点晕.... 今天简单测试了TUniGUIServerModul ...

  8. netty基础

    1,ServerBootstrap  [Bootstrap] 

  9. springBoot 学习(总)

    springBoot有个中文文档网址,应该是持续更新的. 别的资料 http://tengj.top/2017/02/26/springboot1/     http://412887952-qq-c ...

  10. Ubuntu18.04安装Android Studio

    一.安装JDK JDK下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.htm ...