单调队列优化算法(Monotonic Queue Optimization)是一种优化技巧,通常用于解决一些需要维护滑动窗口中最大(最小)值的问题。以下是一个单调队列优化的Java代码示例,用于解决滑动窗口中的最大值问题:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| import java.util.ArrayDeque; import java.util.Deque;
public class MonotonicQueueOptimization {
public static int[] maxSlidingWindow(int[] nums, int k) { int n = nums.length; int[] result = new int[n - k + 1]; int resultIndex = 0; Deque<Integer> deque = new ArrayDeque<>();
for (int i = 0; i < n; i++) { while (!deque.isEmpty() && deque.peekLast() < i - k + 1) { deque.pollLast(); }
while (!deque.isEmpty() && nums[deque.peekFirst()] < nums[i]) { deque.pollFirst(); }
deque.offerFirst(i);
if (i >= k - 1) { result[resultIndex++] = nums[deque.peekLast()]; } }
return result; }
public static void main(String[] args) { int[] nums = {1, 3, -1, -3, 5, 3, 6, 7}; int k = 3;
int[] result = maxSlidingWindow(nums, k);
System.out.print("Max sliding window: "); for (int num : result) { System.out.print(num + " "); } } }
|
在这个示例中,maxSlidingWindow
方法使用单调队列优化解决了滑动窗口中的最大值问题。算法通过维护一个单调递减的队列来存储当前窗口内的元素下标,从而在常数时间内找到窗口内的最大值。
请注意,单调队列优化通常适用于需要在滑动窗口内求最大值(最小值)的问题,可以根据问题的具体需求进行相应的修改。