Algorithm 双端队列-滑动窗口(滑动窗口内最大值/最小值/最大间距)

import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Deque;

public class Ch1_Deque {

    
    public static int[] slidingWindowMax(int[] arr,int k){
        Deque<Integer> deque = new ArrayDeque<Integer>();
        int[] result = new int[arr.length - k + 1];
        for(int i=0;i<arr.length;i++){
            //I.维持一个单调递减队列
            while(!deque.isEmpty() && arr[i] > arr[deque.getLast()]){
                deque.removeLast();
            }
            //II.添加元素到队尾
            deque.add(i);
            //III.超过滑动窗口则移除队首元素
            if(deque.getFirst() == i-k){
                deque.removeFirst();
            }
            //IV.保存结果
            if(i >= k-1){
                result[i+1-k] = arr[deque.getFirst()];
            }
            
        }
        return result;
    }
    
    public static int slidingWindowMaxGap(int[] arr,int k){
        Deque<Integer> max = new ArrayDeque<Integer>();
        Deque<Integer> min = new ArrayDeque<Integer>();
        int result = 0;
        for(int i=0;i<arr.length;i++){
            //最大值
            while(!max.isEmpty() && arr[i] > arr[max.getLast()]){
                max.removeLast();
            }
            max.add(i);
            if(max.getFirst() == i-k){
                max.removeFirst();
            }
            //最小值
            while(!min.isEmpty() && arr[i] < arr[min.getLast()]){
                min.removeLast();
            }
            min.add(i);
            if(min.getFirst() == i-k){
                min.removeFirst();
            }
            //IV.保存结果
            if(i >= k-1){
                result = Math.max(result, arr[max.getFirst()] - arr[min.getFirst()]);
            }
            
        }
        return result;
    }
    
    public static void main(String[] args) {
        int []arr = new int[]{4,3,5,4,3,3,6,7,5,6,1};
        System.out.println(Arrays.toString(slidingWindowMax(arr,3)));
        System.out.println(slidingWindowMaxGap(arr,3));
    }
    
}

 

posted @ 2015-12-02 21:27  √珞珈搬砖工√  阅读(295)  评论(0)    收藏  举报