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

239. 滑动窗口最大值
https://leetcode.cn/problems/sliding-window-maximum/description/

public  int[] maxSlidingWindow(int[] nums, int k) {
        int[] res = new int[nums.length - k + 1];
        int index = 0;
        ArrayDeque<Integer> deque = new ArrayDeque<>();
        for (int i = 0; i < nums.length; i++) {
            while (!deque.isEmpty() && deque.peek() < i - k + 1) {
                deque.poll();
            }
            while (!deque.isEmpty() && nums[i] > nums[deque.peekLast()]) {
                deque.pollLast();
            }
            deque.offer(i);
            if (i >= k - 1) {
                res[index++] = nums[deque.peek()];
            }
        }
        return res;
    }

总结:判断一个区间上的最大值问题直接就想到了堆(优先级队列),但是本题是滑动窗口的,所以涉及到不在窗口内的左侧元素的删除问题,若用优先级队列自带的remove(),显然时间复杂度太高,当滑动窗口的left移动到3时,若最大值出现在3左侧,需要把最大值删除,这不是一个if单个过程,这是while的循环过程,所以队列中存的就不应该是真正的值,而是数组中这个值的下标,所以如果是用优先级队列的话,会根据下标的大小进行排序。所以我们采用deque手动模拟单调队列,当要入队的元素>当前max时,就把当前max弹出,之后再入队,这样每个队头都是当前最大值,还要考虑到最大值在滑动窗口外的情况。
347. 前 K 个高频元素
https://leetcode.cn/problems/top-k-frequent-elements/description/?envType=study-plan-v2&envId=top-100-liked

public int[] topKFrequent(int[] nums, int k) {
        int[] res = new int[k];
        HashMap<Integer,Integer> map = new HashMap<>();
        for (int num : nums) {
            Integer count = map.getOrDefault(num, 0) + 1;
            map.put(num,count);
        }
        PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(( o1,  o2) -> map.get(o2) - map.get(o1));
        for (Integer integer : map.keySet()) {
            priorityQueue.add(integer);
        }
        for (int i = 0; i < k; i++) {
            res[i] = priorityQueue.poll();
        }
        return res;
    }

总结:拿到题一眼大根堆(优先级队列),本题的关键在于优先级队列的比较器,比较的是值出现的次数的大小,而不是值的大小,这就需要维护一个hashmap,key是值,value是出现的次数。

posted @   jeasonGo  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示