力扣labuladong——一刷day87
2024-01-07 18:21:24
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
现在需要一种新的队列结构,既能够维护队列元素「先进先出」的时间顺序,又能够正确维护队列中所有元素的最值,这就是「单调队列」结构。
一、力扣503. 下一个更大元素 II
class Solution {
public int[] nextGreaterElements(int[] nums) {
int n = nums.length;
int[] arr = new int[2*n];
int[] res = new int[n];
for(int i = 0; i < 2*n; i ++){
if(i < n){
arr[i] = nums[i];
}else{
arr[i] = nums[i-n];
}
}
Deque<Integer> deq = new LinkedList<>();
for(int i = 2*n-1; i >= 0; i --){
while(!deq.isEmpty() && deq.peekLast() <= arr[i]){
deq.pollLast();
}
if(i < n){
res[i] = deq.isEmpty() ? -1 : deq.peekLast();
}
deq.offerLast(arr[i]);
}
return res;
}
}
二、力扣239. 滑动窗口最大值
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
MonotonicDeque mq = new MonotonicDeque();
List<Integer> list = new ArrayList<>();
for(int i = 0; i < nums.length; i ++){
if(i < k-1){
mq.push(nums[i]);
}else{
mq.push(nums[i]);
list.add(mq.getMax());
mq.remove(nums[i-k+1]);
}
}
int[] res = new int[list.size()];
for(int i = 0; i < list.size() ; i ++){
res[i] = list.get(i);
}
return res;
}
class MonotonicDeque{
LinkedList<Integer> deq;
public MonotonicDeque(){
this.deq = new LinkedList<Integer>();
}
public void push(int x){
while(!deq.isEmpty() && deq.getLast() < x){
deq.pollLast();
}
deq.addLast(x);
}
public int getMax(){
return deq.getFirst();
}
public void remove(int x){
if(!deq.isEmpty() && deq.getFirst() == x){
deq.pollFirst();
}
}
}
}
文章来源:https://blog.csdn.net/ResNet156/article/details/135438246
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!