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

 

本文参考自《剑指offer》一书,代码采用Java语言。

更多:《剑指Offer》Java实现合集  

题目

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

思路

  与滑动窗口的最大值一题相似,利用一个双端队列来存储当前队列里的最大值以及之后可能的最大值。

  在定义题目要求功能的队列时,除了定义一个队列data存储数值,还需额外用一个队列maxmium存储可能的最大值;此外,还要定义一个数据结构,用于存放数据以及当前的index值,用于删除操作时确定是否删除maxmium中最大值。

  具体实现见代码,代码进行了一些测试,应该没有什么问题。

 

测试算例 

  尾部插入不同大小数字,删除头部数字。插入删除同时获取最大值。

Java代码

import java.util.ArrayDeque;

//题目:请定义一个队列并实现函数max得到队列里的最大值,要求函数max、
//push_back和pop_front的时间复杂度都是O(1)。

public class QueueWithMax {
	private ArrayDeque  data = new ArrayDeque();
	private ArrayDeque maximum = new ArrayDeque();
	private class InternalData{
		int number;
		int index;
		public InternalData(int number,int index) {
			this.number=number;
			this.index=index;
		}
	}
	private int curIndex;
	
	public void push_back(int number) {
		InternalData curData = new InternalData(number,curIndex);
		data.addLast(curData);
		
		while(!maximum.isEmpty() && maximum.getLast().number

  

true
true
true
true
true
true
true
true
true
true
true
true
true
true
QueueWithMax

 

收获

  1.在定义private ArrayDeque  data时,别忘记了new ArrayDeque();否则在插入数据时,会抛出NPE异常。

  2.进行删除操作时,注意是否队列是否为空。

 

更多:《剑指Offer》Java实现合集  

 

转载于:https://www.cnblogs.com/yongh/p/9965541.html

你可能感兴趣的:(【Java】 剑指offer(59-2) 队列的最大值)