239. 滑动窗口最大值
题目链接:239. 滑动窗口最大值 - 力扣(LeetCode)
文档讲解:代码随想录 (programmercarl.com)
视频讲解:单调队列正式登场!| LeetCode:239. 滑动窗口最大值_哔哩哔哩_bilibili
解题思路:
class MyQue {
Deque<Integer> deque = new LinkedList<>();
void poll(int val) {
if (!deque.isEmpty() && val == deque.peek()) {
deque.poll();
}
//若队列不为空且要弹出的数等于队列出口的数则弹出
}
void add(int val) {
while (!deque.isEmpty() && val > deque.getLast()) {
deque.removeLast();
}
//若队列不为空且加入的值大于末尾的数则弹出末尾的数
deque.add(val);
//队列末尾没有比加入的数更大的数时才加入这个数
}
int peek() {
return deque.peek();
}
}
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if (nums.length == 1) {
return nums;
}
int len = nums.length - k + 1;
int[] res = new int[len];
int num = 0;
MyQue myque = new MyQue();
for (int i = 0; i < k; i++) {
myque.add(nums[i]);
}
//先把前k个元素放入队列
res[num++] = myque.peek();
for (int i = k; i < nums.length; i++) {
myque.poll(nums[i - k]);
//按照自定义poll的规则移除队列最前面的元素
myque.add(nums[i]);
//按规则加入最后面的元素
res[num++] = myque.peek();
}
return res;
}
}
时间复杂度:O(n)
该题总结:相当难的一道题,需要自己创造一个递增队列,其中的实现真的不好理解,碰到这种题能照着答案写下来不报错对我来说都算是好的,只能说坚持吧,有空一定要多熟悉java和数据结构,对于做这种算法题太重要了。
347.前 K 个高频元素
题目链接:347. 前 K 个高频元素 - 力扣(LeetCode)
文档讲解:代码随想录 (programmercarl.com)
视频讲解:优先级队列正式登场!大顶堆、小顶堆该怎么用?| LeetCode:347.前 K 个高频元素_哔哩哔哩_bilibili
解题思路:暂时跳过
该题总结:这题跳过主要是因为对大顶堆和小顶堆的不熟悉,在java语言的实现上就算看题解也完全看不懂题解这种大顶堆小顶堆的初始化是如何实现的,故先跳过,对java 和数据结构更熟悉之后再回来做这道题。