image.png

    解法:利用单调双向链表,来获得区间内的最大值。
    晚进队列的值决定了到此之前队列的下限。按照先入队列的顺序,不断提高下限。

    1. public static void main(String[] args) {
    2. int [] arr= {1,2,3};
    3. System.out.println(arr.length);
    4. int[] nums = {1,3,-1,-3,5,3,6,7};
    5. int[] res = maxSlidingWindow(nums, 3);
    6. }
    7. public static int[] maxSlidingWindow(int[] nums, int k) {
    8. if(k<=0) return null;
    9. if(k ==1) return nums;
    10. if(nums == null || nums.length== 0)return new int[0];
    11. if(k >= nums.length) {
    12. int max = Integer.MIN_VALUE;
    13. for(int i : nums){
    14. max = Math.max(max, i);
    15. }
    16. return new int[]{max};
    17. }
    18. int[] res = new int[nums.length-k +1];
    19. int index = 0;
    20. T59_MaxQueue.MaxQueue maxQueue = new T59_MaxQueue.MaxQueue();
    21. for(int i = 0 ; i < nums.length; i ++){
    22. if(i <k){
    23. maxQueue.push_back(nums[i]);
    24. }else {
    25. res[index++] = maxQueue.max_value();
    26. maxQueue.pop_front();
    27. maxQueue.push_back(nums[i]);
    28. }
    29. }
    30. res[index] = maxQueue.max_value();
    31. return res;
    32. }