Skip to content
This repository was archived by the owner on Aug 14, 2024. It is now read-only.

Latest commit

 

History

History
64 lines (49 loc) · 1.56 KB

239.md

File metadata and controls

64 lines (49 loc) · 1.56 KB

239. Sliding Window Maximum

Description

Given an array nums, there is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in the window. Each time the sliding window moves right by one position.

For example, Given nums = [1,3,-1,-3,5,3,6,7], and k = 3.

Window position                Max
---------------               -----
[1  3  -1] -3  5  3  6  7       3
 1 [3  -1  -3] 5  3  6  7       3
 1  3 [-1  -3  5] 3  6  7       5
 1  3  -1 [-3  5  3] 6  7       5
 1  3  -1  -3 [5  3  6] 7       6
 1  3  -1  -3  5 [3  6  7]      7

Therefore, return the max sliding window as [3,3,5,5,6,7].

Thinking Process

  1. Use a max heap to keep track of the sliding window

Code

public int[] maxSlidingWindow(int[] nums, int k) {
    if (nums == null || k <= 0) {
		return new int[0];
	}
    
    PriorityQueue<Integer> window = new PriorityQueue<>(new Comparator<Integer>() {
        public int compare(Integer c1, Integer c2) {
            if(c1 > c2){
                return -1;
            }
            if(c1 < c2){
                return 1;
            }else{return 0;}
            
        }
    });
    int[] max = new int[nums.length - k + 1];
    
    for(int i = 0; i < nums.length; i++){
        if(i < k - 1){
            window.offer(nums[i]);
        }else{
            window.offer(nums[i]);
            max[i - k + 1] = window.peek();
            window.remove(nums[i - k + 1]);
        }
    }
    
    return max;
}

Complexity

  1. Time complexity is O(nlogn)