59_QueueWithMax

package pers.lyt.java;

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

//题目
//	请定义一个队列并实现函数max得到队列里的最大值,要求函数max、push_back和pop_front的
//时间复杂度都是O(1)。
//思路
//	与滑动窗口的最大值一题相似,利用双端队列来存储当前队列里的最大值以及之后可能的最大值
//	在定义题目要求功能的队列时,除了定义一个队列data存储数值,还需额外用一个队列maxmium
//存储可能的最大值;此外,还要定义一个数据结构,用于存放数据以及当前的index值,用于删除
//操作时确定是否删除maxmium中最大值。
public class Offer59_QueueWithMax {
	private Deque<InternalData> data = new ArrayDeque<>();
	private Deque<InternalData> 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 < number)
			maximum.removeLast();
		maximum.addLast(curData);

		curIndex++; // 别漏了这句
	}

	public void pop_front() {
		if (data.isEmpty()) {
			System.out.println("队列为空,无法删除!");
			return;
		}
		InternalData curData = data.removeFirst();
		if (curData.index == maximum.getFirst().index)
			maximum.removeFirst();
	}

	public int max() {
		if (maximum == null) {
			System.out.println("队列为空,无法删除!");
			return 0;
		}
		return maximum.getFirst().number;
	}

	public static void main(String[] args) {
		Offer59_QueueWithMax testQueue = new Offer59_QueueWithMax();
		// {2}
		testQueue.push_back(2);
		System.out.println(testQueue.max() == 2);
		// {2, 3}
		testQueue.push_back(3);
		System.out.println(testQueue.max() == 3);
		// {2, 3, 4}
		testQueue.push_back(4);
		System.out.println(testQueue.max() == 4);
		// {2, 3, 4, 2}
		testQueue.push_back(2);
		System.out.println(testQueue.max() == 4);
		// {3, 4, 2}
		testQueue.pop_front();
		System.out.println(testQueue.max() == 4);
		// {4, 2}
		testQueue.pop_front();
		System.out.println(testQueue.max() == 4);
		// {2}
		testQueue.pop_front();
		System.out.println(testQueue.max() == 2);
		// {2, 6}
		testQueue.push_back(6);
		System.out.println(testQueue.max() == 6);
		// {2, 6, 2}
		testQueue.push_back(2);
		System.out.println(testQueue.max() == 6);
		// {2, 6, 2, 5}
		testQueue.push_back(5);
		System.out.println(testQueue.max() == 6);
		// {6, 2, 5}
		testQueue.pop_front();
		System.out.println(testQueue.max() == 6);
		// {2, 5}
		testQueue.pop_front();
		System.out.println(testQueue.max() == 5);
		// {5}
		testQueue.pop_front();
		System.out.println(testQueue.max() == 5);
		// {5, 1}
		testQueue.push_back(1);
		System.out.println(testQueue.max() == 5);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值