• 代码随想录算法训练营第十三天 | 栈与队列


    239. 滑动窗口最大值

    [题目链接](239. 滑动窗口最大值 - 力扣(Leetcode)) 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

    返回 滑动窗口中的最大值

    解法:单调队列正式登场!| LeetCode:239. 滑动窗口最大值_哔哩哔哩_bilibili

    class MyQueue {
        Deque<Integer> deque = new LinkedList<>();
        //弹出元素时,比较当前要弹出的数值是否等于队列出口的数值,如果相等则弹出
        //同时判断队列当前是否为空
        void poll(int val) {
            if (!deque.isEmpty() && val == deque.peek()) {
                deque.poll();
            }
        }
        //添加元素时,如果要添加的元素大于入口处的元素,就将入口元素弹出
        //保证队列元素单调递减
        //比如此时队列元素3,1,2将要入队,比1大,所以1弹出,此时队列:3,2
        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[] result = new int[len];
            int num = 0;
            //自定义队列
            MyQueue myQueue = new MyQueue();
            //先将前k的元素放入队列
            for (int i = 0; i < k; i++) {
                myQueue.add(nums[i]);
            }
        
            result[num++] = myQueue.peek();
            for (int i = k; i < nums.length; i++) {
                //滑动窗口移除最前面的元素,移除时判断该元素是否放入队列
                myQueue.poll(nums[i - k]);
                //滑动窗口加入最后面的元素
                myQueue.add(nums[i]);
                //记录对应的最大值
                result[num++] = myQueue.peek();
            }
            return result;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    347. 前 K 个高频元素

    [题目链接](347. 前 K 个高频元素 - 力扣(Leetcode)) 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

    解法:map + 优先队列

    1. 用map统计整数出现次数
    2. 用优先队列给出现次数按照从大到小排列顺序
    3. 队列弹出前K个元素
    class Solution {
        public int[] topKFrequent(int[] nums, int k) {
            Map<Integer, Integer> hashMap = new HashMap<>();
            for (int i = 0; i < nums.length; i++) {
                 hashMap.put(nums[i], hashMap.getOrDefault(nums[i], 0) + 1);
            }
            // 优先队列里存储二元组(num, count), 按照队头到队尾是递减的方式存储
            PriorityQueue<int[]> pq = new PriorityQueue<>((arry1, arry2)->arry2[1] - arry1[1]);
            for (Map.Entry<Integer, Integer> entry : hashMap.entrySet()) {
                pq.add(new int[]{entry.getKey(), entry.getValue()});
            }
            int[] result = new int[k];
            for (int i = 0; i < k; i++) {
                result[i] = pq.poll()[0];
            }
            return result;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
  • 相关阅读:
    css渐变
    C++入门(二)
    Spring Boot集成protobuf快速入门Demo
    day52--动态规划11
    laravel框架介绍(一)
    解决ImageTranscoder(PNGTranscoder/JPEGTranscoder/TIFFTranscoder)转图片时的中文乱码问题
    MySQL的事务隔离是如何实现的?
    vue2脚手架组件化开发
    【免费研讨会】7月15日,相约 ZEMAX 中的车载 HUD 设计线上研讨会
    理解ceres
  • 原文地址:https://blog.csdn.net/weixin_43473436/article/details/128177448