剑指offer-11.队列的最大值(292)

11.队列的最大值(292)
  • 题目描述:定义一个队列并实现函数max得到队列里的最大值。要求max,pushBack,popFront的时间复杂度都是o(1)。
  • 思路:用一个双端队列来存放数据元素;再用一个双端队列来存放最大值(相当于一个滑动窗口)
package _11.队列的最大值;

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.LinkedList;

/**
 * 题目描述:定义一个队列并实现函数max得到队列里的最大值。
 * 要求max,pushBack,popFront的时间复杂度都是o(1)。
 * @author Administrator
 *
 */
public class QueueWithMax {
	//定义一个存放数据的双端队列
	private Deque<Integer> dequeData;
	//定义一个存放双端队列中的最大值(相当于只有一个滑动窗口)
	private Deque<Integer> dequeMax;
	
	public QueueWithMax() {
		super();
		this.dequeData = new LinkedList<Integer>();
		this.dequeMax =  new LinkedList<Integer>();
	}

	//入队
	public void push_back(int number) {
		//将元素入队
		dequeData.addLast(number);
		//判断该元素是否为当前队列中的最大值
		while(!dequeMax.isEmpty() && number > dequeMax.getLast()){
			dequeMax.removeLast();
		}
		dequeMax.addLast(number);
	}
	
	//出队:
	public void pop_front() {
		if(dequeData.isEmpty()){
			return;
		}
		//出队之后判断将要出队的元素是否为队中的最大值
		Integer first = dequeData.removeFirst();
		if(dequeMax.getFirst() == first){
			dequeMax.removeFirst();
		}
	}
	//队列中的最大值
	public int max(){
		if(dequeData.isEmpty()){
			return 0;
		}
		return dequeMax.getFirst();
	}

	public static void main(String[] args) {
		QueueWithMax test  = new QueueWithMax();
		test.push_back(2);
		test.push_back(1);
		test.push_back(3);
		test.push_back(3);
		test.pop_front();
		test.pop_front();
		System.out.println(test.max());
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值