代码随想录算法刷题训练营第十天 | 150. 逆波兰表达式求值 239. 滑动窗口最大值 347.前 K 个高频元素

150. 逆波兰表达式求值

题目链接:. - 力扣(LeetCode)

文章讲解:代码随想录 (programmercarl.com)

视频讲解:栈的基本操作! | LeetCode:232.用栈实现队列_哔哩哔哩_bilibili

 思路:栈的应用,逆波兰表达式是把操作符放到两个操作数的后面

解的时候用栈把数压入栈,遇到操作符就取头两个元素进行计算并压栈.

239. 滑动窗口最大值(理解)

题目链接:. - 力扣(LeetCode)

文章讲解:代码随想录 (programmercarl.com)

视频讲解: 队列的基本操作! | LeetCode:225. 用队列实现栈_哔哩哔哩_bilibili

 思路:滑动窗口是有一个长度为k的框子,在数组上移动,求他在移动过程中的最大值

这道题主要是对队列的应用,在窗口移动过程中,窗口中的最大值可能会变,一般做法需要进行查找,找到最大值,这样算法复杂度就到O(n^2)了.

这里窗口滑动的时候,一边进入元素,一边出来元素,而且可以获取队列的最大值,想到用队列实现,这里是单调队列

这个队列就用Deque来实现,双端队列,他可以操作首尾的元素

class MyQueue{
    这里这个队列就是滑动的窗口,
    下面模拟的是滑动窗口滑动的过程以及取最大值操作
    Deque<Integer> deque = new LinkedList<>();
    
    这里进行删除元素,也就是删除最左边的元素;
    删除的时候有点小的没有意义的数已经在添加时删掉了,
    所以这里进行判断要删除的是否还在(也就是和队头的进行比较看是否相等),
    相等代表还在,就删除掉
    void poll(int val){
        if(!deque.isEmpty()&&val==deque.peek()){
            deque.poll();
        }
    }

    添加操作是精髓所在,往里面添加时如果里面有元素,
    就判断最后的那个和要添加到大小,如果是小的话直接删除,
    因为他在该滑动窗口的前面,而且比滑动窗口后面的一个数小,该删!!
    void add(int val){
        if(!deque.isEmpty()&&val>deque.getLast()){
            deque.removeLast();
        }
        deque.add(val);
    }

    这样,队头的那个元素,一直维护为最大值
    int getMax(){
        return deque.peek();    
    }
}

347.前 K 个高频元素(理解)

题目链接:. - 力扣(LeetCode)

文章讲解:代码随想录 (programmercarl.com)

视频讲解:栈的拿手好戏!| LeetCode:20. 有效的括号_哔哩哔哩_bilibili

 思路:这里用到一个新东西,小顶堆,大顶堆;小顶堆--顶部是比两个孩子小;大顶堆--顶部比两个孩子大

求前k个高频元素,首先用map存入这些数,常用操作 ---  mp.put(xx,getOrDefault(xx,0)+1) ; 

1. 然后用大顶堆将mp的key,value全放进去,取前k个即可

2. 或者用小顶堆,维护小顶堆为k个,最后组装数组返回.

遍历map: Map.Entry<Integer,Integer>是一个key,value集合 
Map.EntrySet是所有key,value集合  
keySet是所有key的集合


  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值