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 ...
随机推荐
- UI自动化测试中图片验证码的处理?
首先定位验证码image的元素,然后通过element.screenshot('a.png')截图保存到本地,通过第三方接口识别本地图片验证码
- RocketMQ(5) 订阅关系的一致性规范
多个消费者组订阅了多个Topic,并且每个消费者组里的多个消费者实例的订阅关系应该保持一致. 例如下消费关系, 不同的消费组,消费不同的队列,相同的消费组订阅相同的队列,tag 错误示例: 一个消费者 ...
- CPNtools协议建模安全分析---实例库所标记(四)
1.我们经常使用弧上单个变量表达式来过滤数据类型,如果是多个类型的变量可以嵌套写 像上面的的 库所标记的数值 1·(2,5,"a")++ 那么弧表达式会根据要求来过滤 ...
- 基于Python的子进程获取键盘输入
一 概念 众所周知,python中的获取键盘输入,input函数是没办法用在子程序的,这就限制了它的用途.想要在子程序中获取键盘输入.唯有 fn=sys.stdin.fileno函数了. 二 实例解析 ...
- 基于python中librosa的声音混音实例解析
一 概念 1.一些概念 Librosa是一个用于音频.音乐分析.处理的python工具包,一些常见的时频处理.特征提取.绘制声音图形等功能应有尽有,功能十分强大.本文主要介绍libros的基本用法 ...
- Maven项目不同jar包相同类名的引用问题
本文简单记录下一个小问题 问题描述: 在一个Maven项目中,引用了两个jar包,其中两个jar包中,都含有个相同类(包名也相同),这个时候代码里使用该类,出现引用失败的问题 如下图所示,展开两个ja ...
- json转化总结
最近对接个老接口,返回的信息格式十分清奇,为此折腾了一会,简单记录下 先贴下这个接口返回的格式样子 在本地我使用idea的debug模式调试返回的信息,方式:进入debug模式,请求达到断点处,按组合 ...
- RTP网络包提取码流方法
1.工具wireshark,官网最新的版本没有保存按键,建议使用3.4 链接:https://pan.baidu.com/s/1VHSGgojZPNtzyzV6RMVjkw 提取码:q51a 2.wi ...
- 3DCAT实时云渲染助力广府庙会元宇宙焕新亮相,开启线上奇趣之旅!
超 400 万人次打卡,商圈营业额逾 3.6 亿元,2023 年广府庙会于2023年2月11日圆满落幕. 活动期间,佳境美如画,融合VR.AR.虚拟直播等技术的广府庙会元宇宙焕新亮相,群众只需点击一个 ...
- drf(分页、IP限制用户频率、自动生成文档、RBAC、django缓存)
一 分页 settings.py REST_FRAMEWORK = {'PAGE_SIZE': 2, } views.py # 分页 from rest_framework.pagination im ...