All Downloads are FREE. Search and download functionalities are using the official Maven repository.

g0201_0300.s0239_sliding_window_maximum.Solution Maven / Gradle / Ivy

There is a newer version: 1.38
Show newest version
package g0201_0300.s0239_sliding_window_maximum;

// #Hard #Top_100_Liked_Questions #Top_Interview_Questions #Array #Heap_Priority_Queue
// #Sliding_Window #Queue #Monotonic_Queue #Udemy_Arrays #Big_O_Time_O(n*k)_Space_O(n+k)
// #2022_07_04_Time_58_ms_(52.28%)_Space_145_MB_(50.60%)

import java.util.LinkedList;

/**
 * 239 - Sliding Window Maximum\.
 *
 * Hard
 *
 * You are given an array of integers `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.
 *
 * Return _the max sliding window_.
 *
 * **Example 1:**
 *
 * **Input:** nums = [1,3,-1,-3,5,3,6,7], k = 3
 *
 * **Output:** [3,3,5,5,6,7]
 *
 * **Explanation:**
 *
 *     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 
 *
 * **Example 2:**
 *
 * **Input:** nums = [1], k = 1
 *
 * **Output:** [1] 
 *
 * **Example 3:**
 *
 * **Input:** nums = [1,-1], k = 1
 *
 * **Output:** [1,-1] 
 *
 * **Example 4:**
 *
 * **Input:** nums = [9,11], k = 2
 *
 * **Output:** [11] 
 *
 * **Example 5:**
 *
 * **Input:** nums = [4,-2], k = 2
 *
 * **Output:** [4] 
 *
 * **Constraints:**
 *
 * *   1 <= nums.length <= 105
 * *   -104 <= nums[i] <= 104
 * *   `1 <= k <= nums.length`
**/
public class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        int n = nums.length;
        int[] res = new int[n - k + 1];
        int x = 0;
        LinkedList dq = new LinkedList<>();
        int i = 0;
        int j = 0;
        while (j < nums.length) {
            while (!dq.isEmpty() && dq.peekLast() < nums[j]) {
                dq.pollLast();
            }
            dq.addLast(nums[j]);
            if (j - i + 1 == k) {
                res[x] = dq.peekFirst();
                ++x;
                if (dq.peekFirst() == nums[i]) {
                    dq.pollFirst();
                }
                ++i;
            }
            ++j;
        }
        return res;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy