1.タイトル
配列とスライディングウィンドウのサイズを指定して、すべてのスライディングウィンドウの最大値を見つけます。
たとえば、入力配列{2,3,4,2,6,2,5,1}とスライディングウィンドウサイズが3の場合、合計6つのスライディングウィンドウがあり、それらの最大値は{4、 4,6、6,6,5};
配列{2,3,4,2,6,2,5,1}には6つのスライディングウィンドウがあります:
{[2,3,4]、2,6、 2,5、1}、{2、[3,4,2]、6,2,5,1}、{2,3、[4,2,6]、2,5,1}、{2、 3,4、[2,6,2]、5,1}、{2,3,4,2、[6,2,5]、1}、{2,3,4,2,6、[2 、5、1]}。
2、分析とコード
1.補助キュー
(1)考える
現在のウィンドウで最大値になる可能性のある数値の座標を格納するための補助キューを設計します。ウィンドウがスライドしている
場合:1)新しい番号が現在のキューのテール座標に対応する番号以上の場合、新しい番号がテール番号またはキューより小さくなるまで、テール番号を1つずつポップします。が空である;
2)キューが空であるか、新しい数値が現在のキューテールよりも小さい場合座標が数値に対応する場合、その数値がウィンドウの最大値になり、その座標をキューにプッシュする場合があります;
3)キューの先頭の座標がまだウィンドウ範囲内にあるかどうかを確認します。範囲外の場合は、先頭番号をポップします。
このとき、キューの先頭の座標に対応する数値がスライディングウィンドウの最大値になります。
(2)コード
import java.util.*;
public class Solution {
public ArrayList<Integer> maxInWindows(int [] num, int size)
{
ArrayList<Integer> ans = new ArrayList<>();
if (num.length == 0 || size == 0)
return ans;
ArrayDeque<Integer> deq = new ArrayDeque<>();
for (int i = 0; i < num.length; i++) {
while (!deq.isEmpty() && num[deq.peekLast()] <= num[i])
deq.pollLast();
deq.add(i);
if (deq.peekFirst() + size == i)
deq.pollFirst();
if (i >= size - 1)
ans.add(num[deq.peekFirst()]);
}
return ans;
}
}
(3)結果
実行時間:26ms、占有メモリ:9512k。
3、その他
何もありません。