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

文章介绍了如何使用双端队列(Deque)解决LeetCode中的滑动窗口最大值问题,以及在处理前K个高频元素时,为何选择MaxHeap或MinHeap。在滑动窗口问题中,Deque用于维护窗口内的最大值;而在高频元素问题中,使用MaxHeap来获取出现频率最高的元素。
摘要由CSDN通过智能技术生成

出口维护的是最大值,

要双端栈口用Deque

pop(int val)

        if(!queue.isEmpty( )&& val == queue.front)//说明左边要遗弃的是滑动窗口里面的最大值

                queue.popFont();

push(int val)

        if (!queue.isEmpty() && val > queue.back

                queue.popback();//把后面元素全部弹出

        queue.offerLast(i)

感觉教学视频还是没看懂。。

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        if (nums == null || nums.length == 0) {
            return new int[0];
        }
        Deque<Integer> deque = new LinkedList<>();
        int[] res = new int[nums.length + 1 - k];
        for (int i = 0; i < nums.length; i++) {
            if (!deque.isEmpty() && deque.peekFirst() == i - k) {
                deque.poll();
            }
            while (!deque.isEmpty() && nums[deque.peekLast()] < nums[i]) {
                deque.removeLast();
            }
            deque.offerLast(i);
            if ((i + 1) >= k) {
                res[i + 1 - k] = nums[deque.peek()];
            }
        }
        return res;
    }
}

面试高频题,之前亚麻面的时候问题是MaxHeap和minHeap的区别,以及为什么要选MaxHeap

class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int n : nums) {
            map.put(n, map.getOrDefault(n, 0) + 1);
        }

        PriorityQueue<Map.Entry<Integer,Integer>> pq = new PriorityQueue<>((a,b) ->(a.getValue() - b.getValue()));

        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            pq.add(entry);
            if (pq.size() > k) {
                pq.poll();
            }
        }
        int[] res = new int[k];
        for (int i = res.length - 1; i >= 0; i--) {
            res[i] = pq.poll().getKey();
        }
        return res;
    }
}

所以这次为什么我又用了minHeap?要想一想为什么这么选择,选这个优缺点是什么

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值