Leetcode-队列得最大值
请定义一个队列并实现函数 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-队列得最大值的更多相关文章
- 《剑指offer》第五十九题(队列的最大值)
// 面试题59(二):队列的最大值 // 题目:给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值.例如, // 如果输入数组{2, 3, 4, 2, 6, 2, 5, 1}及滑动窗口的大小 ...
- LeetCode 队列与BFS--岛屿的数量
tags = ["leetcode","队列","BFS","C++","Go"] 岛屿的个数 给定 ...
- 剑指offer——69队列的最大值
题目: 队列的最大值.请定义一个队列并实现函数max得到队列里的最大值,要求函数max.push_back和pop_front的时间复杂度都是O(1). 题解: 使用队列,操持队列的排序为从大到小的顺 ...
- 剑指 Offer 59 - II. 队列的最大值--滑动窗口的建模+Deque的基本使用(常用方法)
剑指 Offer 59 - II. 队列的最大值 题目链接 package com.walegarrett; /** * @Author WaleGarrett * @Date 2020/12/3 1 ...
- [LeetCode] 面试题59 - II. 队列的最大值
题目: 分析: 本题要求三个方法的时间复杂度都是O(1),对于push_back和pop_front都是好实现的 但是对于max_value,正常情况下要进行遍历才能获得最大值,那么如何才能在O(1) ...
- 面试题59 - II. 队列的最大值
请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value.push_back 和 pop_front 的时间复杂度都是O(1). 若队列为空,pop_front 和 ...
- 【Java】 剑指offer(59-2) 队列的最大值
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 请定义一个队列并实现函数max得到队列里的最大值,要求函数ma ...
- 【队列】最大值减去最小值小于等于num的子数组数量
摘自<程序员代码面试指南> 题目: 给定数组 arr 和整数 num, 共返回有多少个⼦数组满⾜如下情况:max(arr[i...j]) - min(arr[i...j]) <= n ...
- 【Offer】[59-2] 【队列的最大值】
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 请定义一个队列并实现函数max得到队列里的最大值,要求函数max.push_back和 pop_front 的时间复杂度都是0(1). ...
- LeetCode - 滑动窗口最大值
给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内的 k 个数字.滑动窗口每次只向右移动一位. 返回滑动窗口中的最大值. 输入: nums ...
随机推荐
- ElasticSearch基本查询使用(2)
在介绍本章之前,需要先打开安装的Kibana页面, 并打开命令行工具页面: 并且根据上节的介绍,我们需要根据中文搜索,所以需要在建立映射时,指定中文字段的分词器为Ik分词器, 默认为英文分词器,每个中 ...
- uni-app实现公众号登陆实现
公众号实现登陆流程思路: 1. 创建一个页面用于登陆,页面上需要有输入账号和密码的表单,以及登陆按钮.2. 在登陆按钮的点击事件中,调用后端接口进行账号密码校验.如果校验通过,则将后端返回的用户信息保 ...
- wav 格式音频文件生成例子
wavfile is a simple sound library for use in CSE 20211. This library allows you to generate arbitrar ...
- Markdown表情参考
emoji-github 文章内容来源 https://github.com/hoangdqvn/emoji-github/blob/master/README.md ️ Emoji-GIT Peop ...
- Web服务器通信原理
Web服务器通信原理 1.区分系统 2.DOS系统 3.IP地址 4.域名.DNS 5.端口 6.HTTP协议 7.Web容器 8.整个流程 一.区分系统 主要三个系统Windows.Linux.Ma ...
- 5分钟上手Python爬虫:从干饭开始,轻松掌握技巧
很多人都听说过爬虫,我也不例外.曾看到别人编写的爬虫代码,虽然没有深入研究,但感觉非常强大.因此,今天我决定从零开始,花费仅5分钟学习入门爬虫技术,以后只需轻轻一爬就能查看所有感兴趣的网站内容.广告? ...
- android ndk生成第三方库的so方法(ndk-build,Application.mk,Android.mk)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- C#实时监测文件夹变化
在开发各种应用程序时,我们经常需要对文件系统中的文件或文件夹进行实时监测,以便在文件内容改变.文件被创建或删除时能够及时做出反应.在 C# 中,System.IO.FileSystemWatcher ...
- Informix日志报错:Could not do a physical-order read to fetch netxt row
jmeter请求接口,1线程不报错,2线程及以上报错"无法执行查询",看后台日志,报错Could not do a physical-order read to fetch net ...
- 使用MFT进行加密文件传输的7个好处
至少,托管文件传输(MFT)解决方案是一种产品,它包含入站和出站文件传输的所有方面,同时使用行业标准的网络协议和无缝加密.它可以从单个集中管理点在您的网络,系统,应用程序,贸易伙伴和云环境中自动化和传 ...