队列 239. 滑动窗口最大值 (单调队列)

题目内容

力扣题目链接

官方java解答 我加了注解

  • 重要是思想
//单调队列,队列存的是下标,下标对应的值是单调的
class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        //先去创建一个双端队列
        Deque<Integer> deque = new LinkedList<Integer>();
        //先从前k个排个单调队列
        for(int i=0;i<k;i++){
            //重点就是明白这个whie循环的作用,是用来不断维护单调队列,如果即将出现的下一个元素比单调队列的队尾元素大,那么队尾元素出栈,直到当前元素小于队尾或者队列中没有元素才进去.
            while(!deque.isEmpty()&&nums[i]>nums[deque.peekLast()]){
                //用官方给的pollLast()也行
                deque.removeLast();
            }
            deque.offerLast(i);
        }
        int [] ans=new int[nums.length-k+1];
        ans[0]=nums[deque.peekFirst()];
        for(int i=k;i<nums.length;i++){
             while (!deque.isEmpty() && nums[i] >= nums[deque.peekLast()]) {
                deque.pollLast();
            }
            deque.offerLast(i);
            while (deque.peekFirst() <= i - k) {
                deque.pollFirst();
            }
             ans[i - k + 1] = nums[deque.peekFirst()];
        }
        return ans;
    }
}

java中Duque的API

boolean 	add(E e)
将指定的元素插入此双端队列表示的队列中(换句话说,在此双端队列的尾部),如果它是立即可行且不会违反容量限制,返回 true在成功时和抛出 IllegalStateException如果当前没有空间可用的。
void 	addFirst(E e)
插入此双端队列的前面,如果它是立即可行且不会违反容量限制,抛出一个指定的元素 IllegalStateException如果当前没有空间可用。
void 	addLast(E e)
在插入如果它是立即可行且不会违反容量限制,抛出此双端队列的末尾指定元素 IllegalStateException如果当前没有空间可用。
boolean 	contains(Object o)
如果此deque包含指定的元素,则返回 true 。
Iterator<E> 	descendingIterator()
以相反的顺序返回此deque中的元素的迭代器。
E 	element()
检索但不删除由此deque表示的队列的头部(换句话说,该deque的第一个元素)。
E 	getFirst()
检索,但不删除,这个deque的第一个元素。
E 	getLast()
检索,但不删除,这个deque的最后一个元素。
Iterator<E> 	iterator()
以正确的顺序返回此deque中的元素的迭代器。
boolean 	offer(E e)
将指定的元素插入由此deque表示的队列(换句话说,在该deque的尾部),如果可以立即执行,而不违反容量限制, true在成功时 false如果当前没有可用空间,则返回falseboolean 	offerFirst(E e)
在此deque的前面插入指定的元素,除非它会违反容量限制。
boolean 	offerLast(E e)
在此deque的末尾插入指定的元素,除非它会违反容量限制。
E 	peek()
检索但不删除由此deque表示的队列的头部(换句话说,此deque的第一个元素),如果此deque为空,则返回 null 。
E 	peekFirst()
检索,但不删除,此deque的第一个元素,或返回 null如果这个deque是空的。
E 	peekLast()
检索但不删除此deque的最后一个元素,如果此deque为空,则返回 null 。
E 	poll()
检索并删除由此deque(换句话说,此deque的第一个元素)表示的队列的 null如果此deque为空,则返回 null 。
E 	pollFirst()
检索并删除此deque的第一个元素,如果此deque为空,则返回 null 。
E 	pollLast()
检索并删除此deque的最后一个元素,如果此deque为空,则返回 null 。
E 	pop()
从这个deque表示的堆栈中弹出一个元素。
void 	push(E e)
将元素推送到由此deque表示的堆栈(换句话说,在此deque的头部),如果可以立即执行此操作而不违反容量限制,则抛出 IllegalStateException如果当前没有可用空间)。
E 	remove()
检索并删除由此deque表示的队列的头(换句话说,该deque的第一个元素)。
boolean 	remove(Object o)
从此deque中删除指定元素的第一个出现。
E 	removeFirst()
检索并删除此deque的第一个元素。
boolean 	removeFirstOccurrence(Object o)
从此deque中删除指定元素的第一个出现。
E 	removeLast()
检索并删除此deque的最后一个元素。
boolean 	removeLastOccurrence(Object o)
从此deque中删除指定元素的最后一次出现。
int 	size()
返回此deque中的元素数。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值