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

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 和数据结构更熟悉之后再回来做这道题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值