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 ...
随机推荐
- Zabbix“专家坐诊”第187期问答汇总
问题一 Q:zabbix server 5.0有办法不通过脚本监控SSL证书到期时间么? A:目前还是流行通过脚本方式去获取. Q:如果是通配符证书应该怎么监控? A:通过解析域名获取对应的过期时间的 ...
- 单词本z develop vel = 到上面 从下面到上面的一种过程 抽象是相对从无到有
单词本z develop vel = 到上面 从下面到上面的一种过程 抽象是相对从无到有 develop 发展 开发 de = down 下面 velop 这里 vel 就是 lev的反写 op = ...
- get 加 header 下载文件 函数,虽然最后没用。
export const apiDown = (url, data = {}) => { let data2 = secretFilter(data) axiosDown({ url, para ...
- Vue 动态插入组件 用js函数的方式
Vue 动态插入组件 用js函数的方式 第一步 import vue组件 第二步 Vue把组件扩展进去 第三步 创建实例 第四步 将组件的el挂载到document.body上 第五步 设置组件内部d ...
- 用于演示文稿的新 Dapr 幻灯片
Dapr 官方博客上(https://blog.dapr.io/posts/2024/03/10/new-dapr-slide-deck-for-your-presentations/)发布了一个新的 ...
- @Autowired和@Resource整理
参考,欢迎点击原文:https://www.ixigua.com/6991282608663593508?id=6945836219422999079&logTag=944f6616c791c ...
- find第二天
find第二天 1.找出/tmp目录下,属主不是root,且文件名不以f开头的文件 find /tmp ! -user root -a ! -name 'f*' 或者 find /tmp ! -use ...
- python基础八(迭代器、生成器、生成式、递归、匿名函数、面向过程编程)
一 迭代器 1.什么是迭代器 迭代器指的是迭代取值的工具,迭代是一个重复的过程,每次重复都是基于上一次的结果而 继续的,单纯的重复并不是迭代2.为何要有迭代器 迭代器是用来迭代取值的工具,而涉及到把多 ...
- 三维模型OBJ格式轻量化顶点压缩主要技术方法分析
三维模型OBJ格式轻量化顶点压缩主要技术方法分析 三维模型的OBJ格式轻量化中,顶点压缩是一项重要的技术方法,用于减小模型文件的大小.以下是关于三维模型OBJ格式轻量化顶点压缩的主要技术方法的分析: ...
- Vite+TS项目:论如何便捷的使用pinia
这里给大家分享我在网上学习总结出来的一些知识,希望对大家有所帮助 pinia 介绍 vue新一代状态管理库,相当于vuex 特性 1.像定义components一样定义store 2.支持ts 3.去 ...