タイトル説明
サイズとスライディングウィンドウの配列を指定し、すべてのスライディングウィンドウの最大値を見つけます。例えば、入力配列{2,3,4,2,6,2、5,1}、およびスライディングウィンドウ3の大きさならば、6つの合計の存在は、スライディングウィンドウ、それらの最大値は、{4,4,6-あります6,6,5}、次の表に示すとおり
アイデア解析
両端で開いているキューを確立する、キューの先頭にすべての最大数(実際に対応するインデックスに格納されている)、および最大値を配置することができます。最初からスキャンアレイ、
- 全ての図面に遭遇数がキューよりも大きい場合は、最大で、その後、他の数は、最大にすることはできません、およびキュー内のすべての数字は、キューの先頭に配置されている数にあけ。
- 出会いの後の数字は、すべての数字がキュー内にあるよりも小さい場合、それはキューの終わりに、スライディングウインドウの最大値になる可能性。
- 数がキューに遭遇した最大値よりも小さい場合は、最小値に大きな、それは最大の数が少ないこと、および小さい番号を削除することはできませんよりも、この番号を入れます。
- スライディングウィンドウのサイズは、ウィンドウサイズよりも大きいスライディングウィンドウの端からキュー番号インデックス距離のヘッド場合従って、キューの先頭には、番号を削除。
- キューに格納されたインデックス番号です
テストケース
- 機能テスト:入力配列サイズ乱数は、単調デジタル入力アレイを増加させる、デジタル入力アレイは、単調に減少します。
- 境界値試験:ウィンドウサイズを摺動する入力配列の長さに等しい0、1、であり、入力配列の長さよりも大きいです。
- 特別な入力テスト:入力配列が空です。
Javaコード
public class Offer059_01 {
public static void main(String[] args) {
test1();
test2();
test3();
}
public static ArrayList<Integer> maxInWindows(int[] num, int size) {
return Solution1(num, size);
}
private static ArrayList<Integer> Solution1(int[] num, int size) {
ArrayList<Integer> max = new ArrayList<Integer>();
if (num == null || num.length <= 0 || size <= 0 || size > num.length)
return max;
ArrayDeque<Integer> indexDeque = new ArrayDeque<Integer>();
for (int i = 0; i < size - 1; i++) {
while (!indexDeque.isEmpty() && num[i] > num[indexDeque.getLast()])
indexDeque.removeLast();
indexDeque.addLast(i);
}
for (int i = size - 1; i < num.length; i++) {
while (!indexDeque.isEmpty() && num[i] > num[indexDeque.getLast()])
indexDeque.removeLast();
if (!indexDeque.isEmpty() && (i - indexDeque.getFirst()) >= size)
indexDeque.removeFirst();
indexDeque.addLast(i);
max.add(num[indexDeque.getFirst()]);
}
return max;
}
private static void test1() {
}
private static void test2() {
}
private static void test3() {
}
}