66スライディングウィンドウ最大

件名の説明:

  すべての値のうちの最大値を見つけるために、ウィンドウをスライド、アレイ、およびスライディングウィンドウのサイズを考えます。例えば、入力配列のサイズ及び{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の要素を起動を格納するために設けられています現在の要素が、現在に対応する要素のインデックス値に格納されたキューの終わりよりも小さくなるまで、要素の値に対応するインデックスに格納されたキューの末尾よりも大きいが、キューの終わりは、ポップアップ場合、値は、現在の要素のインデックスは、尾に追加しましたiはウィンドウ・サイズから1を引いたものよりも大きい要素インデックスをトラバースするときに、キューの末尾に追加添字に対応する要素は、インデックスの対応する要素が値iサイズキューの先頭に等しいとき、ことに留意すべきで、キュー・ストア・ウィンドウ最大のヘッドでありますインデックスに格納された値は、この時間ウィンドウは、キューヘッドに保存された添字に対応する要素が含まれていない証明したとき、それはこの時点でキューヘッドをポップアップする必要があります。

コード:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
public class Solution {
    public ArrayList<Integer> maxInWindows(int [] num, int size)
    {
        ArrayList<Integer>res=new ArrayList<>();
        if(num==null||num.length==0||num.length<size||size<1)
            return res;
        LinkedList<Integer>q=new LinkedList<>(); //存放下标
        for(int i=0;i<num.length;i++){
            while(!q.isEmpty()&&num[i]>=num[q.peekLast()]){
                    q.pollLast(); //当前遍历到的元素大于等于队列尾元素,队列尾部元素弹出,直到小于队列尾元素。
                }
                q.addLast(i);
            
            if(q.peekFirst()==i-size)//如果当前窗口已经不包含队列头下标对应的元素那么我们就要去掉它。
                q.pollFirst();
            if(i>=size-1){//当i大于窗口大小减一时,开始输出窗口中的最大值。
                res.add(num[q.peekFirst()]);
            }
        }
        return res;
    }
}

おすすめ

転載: www.cnblogs.com/yjxyy/p/10962633.html