代码随想录day13|239. 滑动窗口最大值、 347.前 K 个高频元素

Leetcode239. 滑动窗口最大值

注意:×

  1. 注意这个单调队列的写法,其实不难
  2. 注意在maxSliding函数的位置的i<k-1以及下面的i-k-1
  3. 注意在ArrayList数据结构中get()和indexOf()方法的区别
  • get(int index)方法:作用: 返回ArrayList中指定索引位置的元素
  • indexOf(Object o)方法:作用: 返回指定元素在ArrayList中第一次出现的索引位置
public int[] maxSlidingWindow(int[] nums, int k) {
        MonotonicQueue mq = new MonotonicQueue();
        ArrayList<Integer> res = new ArrayList<>();
        for (int i = 0; i < nums.length; i++) {
            if (i < k - 1) {
                mq.push(nums[i]);
            } else {
                mq.push(nums[i]);
                res.add(mq.getMax());
                mq.pop(nums[i - k + 1]);

            }
        }
        // 需要转成 int[] 数组再返回
        int[] arr = new int[res.size()];
        for (int i = 0; i < res.size(); i++) {
            arr[i] = res.get(i);
        }
        return arr;
    }

    class MonotonicQueue {
        private LinkedList<Integer> ll = new LinkedList<Integer>();

        public void push(int num) {
            while (!ll.isEmpty() && num > ll.getLast()) {
                ll.pollLast();
            }
            ll.addLast(num);
        }

        public void pop(int num) {
            if (num == ll.getFirst()) {
                ll.pollFirst();
            }
        }

        public int getMax() {
            return ll.getFirst();
        }
    }

Leetcode 347.前 K 个高频元素

注意:×

  1. 纯抄的Labuladong,学习了优先队列的写法
  2. PriorityQueue<Map.Entry<Integer,Integer>> pq = new PriorityQueue<>((e1,e2)->{return e1.getValue().compareTo(e2.getValue());});这个里面的Entry的做法
  3. 注意遍历Map所有键值对的方式
    public int[] topKFrequent(int[] nums, int k) {
        // 1.使用HashMap记录每个字符出现的次数
        HashMap<Integer, Integer> valToFreq = new HashMap<>();
        for (int num :
                nums) {
            valToFreq.put(num, valToFreq.getOrDefault(num, 0) + 1);
        }

        // 2.遍历HashMap将键值对送入优先队列中
        PriorityQueue<Map.Entry<Integer,Integer>> pq = new PriorityQueue<>((e1,e2)->{return e1.getValue().compareTo(e2.getValue());});
        for (Map.Entry<Integer,Integer> e:valToFreq.entrySet()){
            pq.offer(e);
            if (pq.size()>k){
                pq.poll();
            }
        }

        // 3.优先队列转成int[]
        int[] res = new int[k];
        for (int i = k-1; i >=0; i--) {
            res[i] = pq.poll().getKey();
        }
        return res;
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值