66. 슬라이딩 윈도우 최대

주제 설명 :

  모든 값 중 최대 값을 찾기 위해 슬라이딩 윈도우 배열과 슬라이딩 윈도우의 크기를 감안. 예를 들어, 입력 배열 크기 및 {2,3,4,2,6,2,5,1} (3)가 슬라이딩 창 '라면, 최대 값은 {4,4,6 여섯 슬라이딩 윈도우 전체의 존재이다 6,6,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,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)]}.

아이디어의 분석 :

  대기열들로 큐 요소 인덱스의 첫번째 요소의 인덱스를 저장하기 위해 제공되고, 현재 요소의 값이 첨자에 대응하는 요소에 저장된 큐의 하단부 미만이면, 어레이를 통해 두 번째 요소를 시작합니다 요소의 값에 대응하는 인덱스에 저장된 큐의 끝보다 큰 큐의 끝 팝업 경우 현재의 구성 요소가 그 시점에 해당하는 원소의 인덱스 값에 저장된 큐의 끝보다 작을 때까지 값, 현재 요소의 인덱스는 테일에 추가 엘리먼트 인덱스를 통과 할 때 큐의 끝에 추가의 첨자에 대응하는 요소가, 나 윈도우 크기를 뺀 것보다 큰 인덱스의 해당 요소 값이 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