タイトル説明
関数maxを必要と定義し、関数maxキューの最大値を取得するためにキューを実装し、時間計算量は0一backとpop_front(1)です。
ノー[牛質問アドレスネットワークをはねのけます]
アイデア解析
- 現在のキューの最大値を格納するための一つであり、可能な最大値の後のある両端キュー。
- と、また、データを格納するため、データ構造を定義し、現在のインデックス値、キューの機能要件主題を定義する際に、データ値を格納することに加えて、可能な最大の余分な記憶maxmiumのコストとキューのキューを定義します最大maxmiumが削除時に削除するかどうかを判断します。
テストケース
異なるサイズのキュー番号の末尾に挿入され、最大値を選択し、キューの先頭から番号を削除し、最大値を選択します。
Javaコード
public class Offer059_02 {
public static void main(String[] args) {
test1();
test2();
test3();
}
private ArrayDeque<InternalData> data = new ArrayDeque<InternalData>();
private ArrayDeque<InternalData> maximum = new ArrayDeque<InternalData>();
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;
}
private static void test1() {
}
private static void test2() {
}
private static void test3() {
}
}