请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若队列为空,pop_front 和 max_value 需要返回 -1

O(1) 复杂度,意味着min值需要采取特殊手段:双端队列:

  • 当push的值大于队尾元素,则pop掉队列中比这个值大的元素,再把这个元素入队
  • 否则,直接入队
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <climits> using namespace std; /*
tail = 0,head=0,max_size;
push:
pop:
empty:
full:
*/ class Dequque{
private:
int *data;
int max_size;
int head_loc;
int tail_loc;
public:
Dequque();
void push(const int value);
void pop_back();
void pop_front();
int front();
int tail();
bool empty();
bool full();
}; Dequque::Dequque(){
max_size = 10000;
head_loc = 0;
tail_loc = 0;
data = new int[max_size];
} void Dequque::push(const int value){
if(full())
std::cerr<<"full, cant push"<<endl;
data[tail_loc] = value;
tail_loc = (tail_loc+1) % max_size;
} void Dequque::pop_back(){
if(empty())
std::cerr<<"empty, cant pop back"<<endl;
tail_loc = (tail_loc-1) % max_size;
} void Dequque::pop_front(){
if(empty())
std::cerr<<"empty, cant pop front"<<endl;
head_loc = (head_loc+1) % max_size; } int Dequque::front(){
if(!empty())
return data[head_loc];
return -1;
} int Dequque::tail(){
if(!empty())
return data[tail_loc-1];
return -1;
} bool Dequque::empty(){
return head_loc==tail_loc;
} bool Dequque::full(){
return (tail_loc+1) % max_size == head_loc;
} class MaxQueue {
private:
int *data;
int max_size;
int head;
int tail; Dequque dequeue; public:
MaxQueue() {
data = new int[10000];
max_size = 10000;
head = 0;
tail = 0;
} int max_value_slow(){
int max_val = INT_MIN;
if(head==tail)
return -1;
for(int i=head;i<=tail;i++)
max_val = max(max_val, data[i]);
return max_val;
} int max_value(){
if(!dequeue.empty())
return dequeue.front();
return -1;
} void push_back(int value) {
data[tail] = value;
tail = (tail+1)%max_size; if(dequeue.empty() || dequeue.tail()>value)
dequeue.push(value);
else{
while(!dequeue.empty() && dequeue.tail()<value)
dequeue.pop_back();
dequeue.push(value);
}
} int pop_front(){
if(empty())
return -1;
int val = front();
head = (head+1)%max_size; if(val==dequeue.front())
dequeue.pop_front(); return val;
} int front(){
if(!empty())
return data[head];
else
return -1;
} bool empty(){
return head==tail;
}
};

Leetcode-队列得最大值的更多相关文章

  1. 《剑指offer》第五十九题(队列的最大值)

    // 面试题59(二):队列的最大值 // 题目:给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值.例如, // 如果输入数组{2, 3, 4, 2, 6, 2, 5, 1}及滑动窗口的大小 ...

  2. LeetCode 队列与BFS--岛屿的数量

    tags = ["leetcode","队列","BFS","C++","Go"] 岛屿的个数 给定 ...

  3. 剑指offer——69队列的最大值

    题目: 队列的最大值.请定义一个队列并实现函数max得到队列里的最大值,要求函数max.push_back和pop_front的时间复杂度都是O(1). 题解: 使用队列,操持队列的排序为从大到小的顺 ...

  4. 剑指 Offer 59 - II. 队列的最大值--滑动窗口的建模+Deque的基本使用(常用方法)

    剑指 Offer 59 - II. 队列的最大值 题目链接 package com.walegarrett; /** * @Author WaleGarrett * @Date 2020/12/3 1 ...

  5. [LeetCode] 面试题59 - II. 队列的最大值

    题目: 分析: 本题要求三个方法的时间复杂度都是O(1),对于push_back和pop_front都是好实现的 但是对于max_value,正常情况下要进行遍历才能获得最大值,那么如何才能在O(1) ...

  6. 面试题59 - II. 队列的最大值

    请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value.push_back 和 pop_front 的时间复杂度都是O(1). 若队列为空,pop_front 和 ...

  7. 【Java】 剑指offer(59-2) 队列的最大值

      本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请定义一个队列并实现函数max得到队列里的最大值,要求函数ma ...

  8. 【队列】最大值减去最小值小于等于num的子数组数量

    摘自<程序员代码面试指南> 题目: 给定数组 arr 和整数 num, 共返回有多少个⼦数组满⾜如下情况:max(arr[i...j]) - min(arr[i...j]) <= n ...

  9. 【Offer】[59-2] 【队列的最大值】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 请定义一个队列并实现函数max得到队列里的最大值,要求函数max.push_back和 pop_front 的时间复杂度都是0(1). ...

  10. LeetCode - 滑动窗口最大值

    给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内的 k 个数字.滑动窗口每次只向右移动一位. 返回滑动窗口中的最大值. 输入: nums ...

随机推荐

  1. [C++逆向] 6 函数的工作原理

    目录 栈帧的形成和关闭 各种调用方式的考察 _stdcall _cdecl _fastcall 使用ebp或者esp寻址 某次调用函数时的栈结构 函数参数 不定长参数 函数的返回值 栈帧的形成和关闭 ...

  2. 15. JVM垃圾回收器详解

    1. 垃圾回收器的分类 和 GC性能指标 垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商.不同版本的JVM来实现. 由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC ...

  3. nginx设置访问账号密码

    第一:为kibana加上了用户登陆访问 第二:不暴露服务器上5601端口,只开放80端口即可.这对服务器的安全也是一个很大的保护. 接下来我们就开始配置nginx与kibana. 一.配置nginx ...

  4. 使用 Docker 部署 GLPI 资产管理系统

    1)GLPI 介绍 GLPI 简介 参考: https://github.com/glpi-project/glpi 官方文档:https://glpi-project.org/documentati ...

  5. ansible-vault 教程

    基本使用 在编写playbook时,可能会涉及到一些敏感的数据,比如密码,当这些敏感数据以明文的方式存储在playbook中时,可能是不能被接受的,那么我们该怎么办呢?ansible官方已经考虑到了这 ...

  6. iview 表单验证 爆红后,有某些组件现隐,爆红和必填会错位,解决方案 组件上加key

    iview 表单验证 爆红后,有某些组件现隐,爆红和必填会错位,解决方案 组件上加key

  7. java学习 javaz-001 Helloworld 第一个demo

    java学习 javaz-001 Helloworld 第一个demo 目录 学习目标 前期准备 java sdk 1.8环境 编辑器IDE的选择 代码开发 目录结构 创建第一个java文件 创建第2 ...

  8. 基于python的环境噪声监测报警系统实例解析

    一 系统简介 1.简介 该系统可以实时显示噪声量大小,并进行一段时间的噪声统计. 2.特性 实现噪声值的统计 实现了噪声显示 完整的主题和样式控制 多线程的运行模式 二 源码解析 1.串口db值获取: ...

  9. java多线程的锁整理

    参考,欢迎点击原文:https://www.jianshu.com/p/473a3d96a1b0(java锁总结) https://www.jianshu.com/p/dcabdf695557(Ree ...

  10. 性能优化:编译器优化选项 -O2/-O3 究竟有多强大?

    之前的"性能优化的一般策略及方法"一文中介绍了多种性能优化的方法.根据以往的项目经验,开启编译器优化选项可能是立竿见影.成本最低.效果最好的方式了. 这么说可能还不够直观,举个真实 ...