1.タイトル説明
/ * すべての値のうちの最大値を見つけるために、ウィンドウをスライド、アレイ、およびスライディングウィンドウのサイズを考えます。 例えば、入力配列のサイズ及び{2,3,4,2,6,2,5,1} 3は、スライディングウィンドウ場合、次いで、それらの最大値は、{4,4,6- 6つのスライディングウィンドウの合計の存在であります6,6,5}; それ持つスライディングウィンドウの次の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}、
{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.アイデア
/ ** *タイトル:最大スライディングウィンドウ *アイデア:スライディングウィンドウはスライディングウィンドウの最大値を得るために、キューであるべきで、配列の両端からキュー要素が削除されてもよいので、両端キューを使用します。 *原理: *新しい要素のためのCが、それは両端キューの要素と比較される * 1)リア(キューの末尾)Cよりも小さい場合、X、直接もはやスライディングウィンドウの背後にあってもよいです(キューから削除されていません最大値);! * 2)キューの(ヘッド)の前面に2添字を比較し、X cよりも大きい場合には、Xは、直接デキューGONEウィンドウ内か否かが判定される。 * 3)キューの要素は、スライディングウィンドウ内の最大値です。 * /
3.コード
インポート java.utilのクラス*。; パブリック クラスソリューション{ 公共のArrayList <整数> maxInWindows(INT [] NUM、int型のサイズ){ IF(NUM == NULL || num.lengthサイズ== 0 || <|| NUM = 0 .LENGTH < サイズ){ 戻り 新しい新規のArrayList <整数> () } のArrayListの結果は= <整数> 新しい新規のArrayList <> (); // 両端キューは、各ウィンドウの添字の最大値を記録するために使用される のLinkedList <整数> = Qmaxの新しい新しい LinkedListの<> (); int型のインデックス= 0; については(int型 I = 0;私はnum.lengthを<;私は++ ){ // キューが空とキュー<現在の値の最後の要素ではない場合、それはもはや不可能で後ろのスライディングウィンドウの最大値があるため しばらく(Qmaxを! .isEmpty()&& NUM [qmax.peekLast()] < NUM [I]){ qmax.pollLast(); } qmax.addLast(I); // 有効期限が切れているキューの素子ヘッドを分析 しばらく(qmax.peekFirst()< I = - サイズ){ qmax.pollFirst(); } // 最初の要素は、キューの先頭を確実にするながら、2以上の各ウィンドウの最大値は、 // 各ウィンドウ(音符の最大値を保存する:サイズ時-1) IF(I> =サイズ- 1。){ result.add(NUM [qmax.peekFirst()])。 } } 戻り値の結果; } }