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

分析:
本题要求三个方法的时间复杂度都是O(1),对于push_back和pop_front都是好实现的
但是对于max_value,正常情况下要进行遍历才能获得最大值,那么如何才能在O(1)的时间复杂度下获得最大值?
O(1)时间复杂度意味着直接便可以获得最大值,一开始的想法是设置两个变量,一个最大值max,一个第二大值max_2,每次push_back时进行更新,若pop_front的值与最大值相同,便让max = max_2
但这样有个问题,当连续两次pop_front,同时前两大的数字都被pop出去时,max与max_2存储的值都是错误的,如果要重新确定max与max_2的值,又要进行遍历了
后来看了题解,里面提到维护一个排序队列(双向),当一个元素cur插入时,它前面所有比它小的值都不会对最大值有影响,而比它大的已经出队了,因为正常出队时,出到cur时,它前面的所有值已全部出队,所以插入时更新双向排序队列,只保留比当前值大的值的有序队列,便可以直接取到max_value,同时不必担心连续出队导致的找不大最大值,如果出队的值真好是当前的最大值,只需要将双向队列的队头出队即可
至于为何时间复杂度为O(1), 题解中提到:

我的理解是,在插入时,会将小于当前值的值出队,不过这个出队的操作次数是有限的,一个插入操作最多只有n个出队操作,更多的情况是小于n个操作,也就是说n个插入操作总共进行了n次出队,平均下来就是O(1)的复杂度
代码:
class MaxQueue {
queue<int> que;
deque<int> deq;
public:
MaxQueue() {
}
int max_value() {
if(deq.empty()) return -;
return deq.front();
}
void push_back(int value) {
while(!deq.empty() && deq.back()<value)
deq.pop_back();
deq.push_back(value);
que.push(value);
}
int pop_front() {
if(que.empty()) return -;
int res = que.front();
que.pop();
if(res == deq.front()) deq.pop_front();
return res;
}
};
/**
* Your MaxQueue object will be instantiated and called as such:
* MaxQueue* obj = new MaxQueue();
* int param_1 = obj->max_value();
* obj->push_back(value);
* int param_3 = obj->pop_front();
*/
[LeetCode] 面试题59 - II. 队列的最大值的更多相关文章
- 面试题59 - II. 队列的最大值
请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value.push_back 和 pop_front 的时间复杂度都是O(1). 若队列为空,pop_front 和 ...
- 《剑指offer》面试题59 - II. 队列的最大值
问题描述 请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value.push_back 和 pop_front 的均摊时间复杂度都是O(1). 若队列为空,pop_ ...
- 剑指 Offer 59 - II. 队列的最大值--滑动窗口的建模+Deque的基本使用(常用方法)
剑指 Offer 59 - II. 队列的最大值 题目链接 package com.walegarrett; /** * @Author WaleGarrett * @Date 2020/12/3 1 ...
- [LeetCode]面试题53 - I. 在排序数组中查找数字 I(二分);面试题53 - II. 0~n-1中缺失的数字(二分)
##面试题53 - I. 在排序数组中查找数字 I ###题目 统计一个数字在排序数组中出现的次数. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: 2 ...
- Leetcode:面试题68 - II. 二叉树的最近公共祖先
Leetcode:面试题68 - II. 二叉树的最近公共祖先 Leetcode:面试题68 - II. 二叉树的最近公共祖先 Talk is cheap . Show me the code . / ...
- Leetcode:面试题55 - II. 平衡二叉树
Leetcode:面试题55 - II. 平衡二叉树 Leetcode:面试题55 - II. 平衡二叉树 Talk is cheap . Show me the code . /** * Defin ...
- 【算法训练营day4】LeetCode24. 两两交换链表中的结点 LeetCode19. 删除链表的倒数第N个结点 LeetCode面试题 02.07. 链表相交 LeetCode142. 环形链表II
[算法训练营day4]LeetCode24. 两两交换链表中的结点 LeetCode19. 删除链表的倒数第N个结点 LeetCode面试题 02.07. 链表相交 LeetCode142. 环形链表 ...
- LeetCode 题解 | 面试题57 - II. 和为s的连续正数序列
题目描述 面试题57 - II. 和为s的连续正数序列 难度简单37收藏分享切换为英文关注反馈 输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数). 序列内 ...
- 《剑指offer》第五十九题(队列的最大值)
// 面试题59(二):队列的最大值 // 题目:给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值.例如, // 如果输入数组{2, 3, 4, 2, 6, 2, 5, 1}及滑动窗口的大小 ...
随机推荐
- 30)PHP,引用对象和克隆对象的区别
复制文件.建立快捷方式的区别,克隆就是复制,引用就是快捷方式,引用的对象实际上同一个东西,修改任何一个变量,另外一个也会跟着变化.
- Linux基本操作_20191117
VMware和Ubuntu的安装, 想来想去,还是需要安装,不能老是使用Windows的,后面还有很多都要用到Linux系统的,这个可以说是开发人员必备的了, 基本的使用: 1,Windows下面C: ...
- [LC] 156. Binary Tree Upside Down
Given a binary tree where all the right nodes are either leaf nodes with a sibling (a left node that ...
- 一、美国国家经济研究局NBER教育经济研究项目工作论文合集
一.美国国家经济研究局NBER教育经济研究项目工作论文合集 (一)项目地址: American National Bureau of Economic Research - Economics of ...
- [LC] 674. Longest Continuous Increasing Subsequence
Given an unsorted array of integers, find the length of longest continuous increasing subsequence (s ...
- SHELL用法七(Sed语句)
1.SHELL编程Sed语句案例实战 1)SHELL编程四剑客之二的Sed工具,主要是用于Linux系统文本文件的编辑. 打印的,也称为非交互模式编辑器(vi|vim交互模式编辑器),Sed工具的语法 ...
- the Uneducated are|anymore|that| so as to |die from|die of|
定冠词加上某些形容词可以泛指一类人,谓语动词一般用复数形式,the uneducated泛指未受过教育的人, the Uneducated are more to be pitied than bla ...
- CF-1102E-Monotonic Renumeration
比较可惜昨天比赛的时候时间不够了,在比赛结束之后五分钟找出了bug提交通过了.然并软: 首先这题说b数组的后一项要么等于前一项,要么等于前一项加一,而且如果a[i] == a[j] ,那么b[i] = ...
- a, b = a, a+b 和a=b b=a+b的区别
n,a,b=0,0,1 while n<5: print(b) a,b=b,a+b n=n+1 和 n,a,b=0,0,1 while n<5: print(b) a=b b=a+b n= ...
- 原创:CentOS 环境中 Zabbix 3.4 的安装部署实践
IT管理工作中,如果没有对服务器.网络设备.服务.进程.应用等的监控,往往是用户发送问题报告后才知道出了问题.事后救火显得被动,不能从容面对问题. 才有了部署一套网络监控系统的想法,机缘巧合下结识了Z ...