首页 > 代码库 > LeetCode-Sliding Window Maximum

LeetCode-Sliding Window Maximum

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].

Note:
You may assume k is always valid, ie: 1 ≤ k ≤ input array‘s size for non-empty array.

Follow up:
Could you solve it in linear time?

Analysis:

Think in this way, assume k = 4, at the beginning, it is

a b c d |: max(a,b,c,d)

move to right one step:

b c d | e: max(b,c,d) or max(e)

move to rigth two step:

c d | e f: max(c,d) or max(e,f)

move to right three steps:

d | e f g: max(d) or max(e,f,g,).

move to right four steps:

| e f g h | : max(e,f,g,h).

So it always equal to a right max and a left max.

Solution:

 1 public class Solution { 2     public int[] maxSlidingWindow(int[] nums, int k) { 3         if (k==0 || nums.length==0 || k>nums.length) return new int[k]; 4          5         int[] windowMax = new int[nums.length - k + 1]; 6         int[] rightMax = new int[k]; 7         // Initialization 8         int index = k - 1; 9         int wIndex = 0;10         int mIndex = 0;11         int leftMax = Integer.MIN_VALUE;12         while (index < nums.length) {13             // if reaches the end of current section.14             if ((index + 1) % k == 0) {15                 // Renew right max, reset right max index16                 mIndex = 0;17                 getRightMax(rightMax, index++, nums, k);18                 windowMax[wIndex++] = rightMax[mIndex++];19                 leftMax = Integer.MIN_VALUE;20             } else {21                 // Get left max.22                 leftMax = Math.max(leftMax, nums[index++]);23                 windowMax[wIndex++] = Math.max(leftMax, rightMax[mIndex++]);24             }25         }26         return windowMax;27     }28 29     // starting from index, moving to left for k elements, get each max30     public void getRightMax(int[] rightMax, int index, int[] nums, int k) {31         int max = Integer.MIN_VALUE;32         int mIndex = k - 1;33         for (int i = index; i >= index - k + 1; i--) {34             max = Math.max(max, nums[i]);35             rightMax[mIndex--] = max;36         }37     }38 }

Solution 2:

https://discuss.leetcode.com/topic/19055/java-o-n-solution-using-deque-with-explanation/2

LeetCode-Sliding Window Maximum