239. Sliding Window Maximum
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.
题目解析:
- 滑动窗口的最值问题可以使用单调队列,时间复杂度O(n)
代码:
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
Deque<Integer> q = new ArrayDeque<>();
int[] result = new int[nums.length - k + 1];
int index = 0;
for (int i = 0; i < nums.length; i++) {
while(q.size() > 0 && nums[q.peekLast()] < nums[i]) {
q.pollLast();
}
q.addLast(i);
while(i - k + 1 > q.peekFirst()) {
q.pollFirst();
}
if (i >= k - 1) {
result[index++] = nums[q.peekFirst()];
}
}
return result;
}
}
Java 中的
ArrayDeque和LinkedList都实现了Deque接口,因此我们可以选择适合问题需求的具体实现。
347. Top K Frequent Elements
Given an integer array nums and an integer k, return the k most frequent elements. You may return the answer in any order.
题目解析:
- topk 的问题可以使用堆(大顶堆)来解决
代码:
class Solution {
public int[] topKFrequent(int[] nums, int k) {
PriorityQueue<int[]> heap = new PriorityQueue<>((arr1, arr2) -> arr2[1] - arr1[1]);
Map<Integer, Integer> map = new HashMap<>();
for (int val : nums) {
map.put(val, map.getOrDefault(val, 0) + 1);
}
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
heap.add(new int[]{entry.getKey(), entry.getValue()});
}
int[] result = new int[k];
for (int i = 0; i < k; i++) {
result[i] = heap.poll()[0];
}
return result;
}
}
PriorityQueue 的 Comparator 可以使用lambda表达式实现
总结
单调栈(Monotonic Stack):
单调栈是一种栈数据结构,其中栈内的元素保持单调递增或单调递减的顺序。通常,单调栈用于解决与找到元素的 "下一个更大元素" 或 "下一个更小元素" 有关的问题。这些问题可以在数组或列表中找到某个元素右边或左边的第一个较大或较小元素。
常见问题:
- 下一个更大元素(Next Greater Element)
- 下一个更小元素(Next Smaller Element)
- 柱状图中的最大矩形(Largest Rectangle in Histogram)
- 接雨水(Trapping Rain Water)
单调队列(Monotonic Queue):
单调队列是一种队列数据结构,其中队列中的元素保持单调递增或单调递减的顺序。通常,单调队列用于解决与找到滑动窗口中的最大值或最小值有关的问题。滑动窗口是一个固定大小的窗口,从数据流中滑动,并在每个位置上获取窗口中的元素,然后计算窗口内的最大值或最小值。
常见问题:
- 滑动窗口最大值(Sliding Window Maximum)
- 滑动窗口最小值(Sliding Window Minimum)