代码随想录算法训练营第十三天|239. 滑动窗口最大值 347.前 K 个高频元素 总结

一、239. 滑动窗口最大值 

题目:给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回滑动窗口中的最大值。

代码随想录算法训练营第十三天|239. 滑动窗口最大值 347.前 K 个高频元素 总结_第1张图片

分析:使用队列的性质来做,主要涉及了三个函数,pop()、push()、getMaxValue()

代码:

//解法一
//自定义数组
class MyQueue {
    Deque deque = new LinkedList<>();
    //弹出元素时,比较当前要弹出的数值是否等于队列出口的数值,如果相等则弹出
    //同时判断队列当前是否为空
    //保证顶的位置是最大值
    void poll(int val) {
        if (!deque.isEmpty() && val == deque.peek()) {
            deque.poll();//poll()方法用于返回此双端队列表示的队列的head元素,但要从此双端队列中移除head元素。
        }
    }
    //添加元素时,如果要添加的元素大于入口处的元素,就将入口元素弹出
    //保证队列元素单调递减
    //比如此时队列元素3,1,2将要入队,比1大,所以1弹出,此时队列:3,2
    //Array_Deque.getLast():    参数:该方法不取任何参数。 返回值:该方法返回德格中存在的最后一个元素。 异常:这个方法抛出 NoSuchElementException,如果这个 deque 被调用时是空的。
    //removeLast():删除最后的元素
    void add(int val) {
        while (!deque.isEmpty() && val > deque.getLast()) {
            deque.removeLast();//用while是因为可能有全部弹出的情况,保证最顶为最大值
        }
        deque.add(val);
    }
    //队列队顶元素始终为

你可能感兴趣的:(数据结构)