[オファー] [59-2] [最大キュー]

タイトル説明

  関数maxを必要と定義し、関数maxキューの最大値を取得するためにキューを実装し、時間計算量は0一backとpop_front(1)です。

ノー[牛質問アドレスネットワークをはねのけます]

アイデア解析

  1. 現在のキューの最大値を格納するための一つであり、可能な最大値の後のある両端キュー。
  2. と、また、データを格納するため、データ構造を定義し、現在のインデックス値、キューの機能要件主題を定義する際に、データ値を格納することに加えて、可能な最大の余分な記憶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() {
    }
}

コードリンク

安全コードを証明するためにオファー-Java

おすすめ

転載: www.cnblogs.com/haoworld/p/offer592-dui-lie-de-zui-da-zhi.html