• leetcode-10-[150]逆波兰表达式求值 [239]滑动窗口最大值[347]前k个高频元素


    一、[150]逆波兰表达式求值

    重点:逆波兰表示法转中缀表达式时,

    “-”、“/”,第二个弹出的元素  “-”  第一个弹出的元素

    1. class Solution {
    2. public int evalRPN(String[] tokens) {
    3. //栈内存Integer,比存String好一些,省去了类型转换
    4. LinkedList stack=new LinkedList<>();
    5. for(int i=0;i< tokens.length;i++){
    6. String s=tokens[i];
    7. if("+".equals(s)){
    8. stack.push(stack.pop()+stack.pop());
    9. }else if("-".equals(s)){
    10. int s1=stack.pop();
    11. int s2=stack.pop();
    12. stack.push(s2-s1);
    13. } else if ("*".equals(s)) {
    14. stack.push(stack.pop()*stack.pop());
    15. } else if ("/".equals(s)) {
    16. //注意,弹出的第二个数/弹出的第一个数
    17. int s1=stack.pop();
    18. int s2=stack.pop();
    19. stack.push(s2/s1);
    20. }else{
    21. stack.push(Integer.parseInt(s));
    22. }
    23. }
    24. return stack.pop();
    25. }
    26. }

    二、[239]滑动窗口最大值

    重点:单调队列 双端队列

    1、存储的为数组下标

    2、需要保证队列元素在[i+1-k,i]区间,即当队头元素不在这个区间内,及时移出

    3、加入的元素值必须小于队尾元素的值(始终保证队头元素最大),否则移出队尾元素,直到满足该条件

    1. class Solution {
    2. public int[] maxSlidingWindow(int[] nums, int k) {
    3. //单调队列 双端队列
    4. //存储下标
    5. Deque queue=new ArrayDeque<>();
    6. int[] res=new int[nums.length-k+1];
    7. int resId=0;
    8. for(int i=0;i< nums.length;i++){
    9. //[i+1-k,i]
    10. while(!queue.isEmpty()&&queue.peekFirst()1){
    11. queue.pollFirst();
    12. }
    13. while(!queue.isEmpty()&&nums[i]>nums[queue.peekLast()]){
    14. //弹出队尾元素
    15. queue.pollLast();
    16. }
    17. queue.offer(i);
    18. if(i+1>=k){
    19. res[resId++]=nums[queue.peekFirst()];
    20. }
    21. }
    22. return res;
    23. }
    24. }

    三、[347]前k个高频元素

    重点:小顶堆

    Comparator接口说明:
    返回负数,形参中第一个参数排在前面;返回正数,形参中第二个参数排在前面

     对于队列:排在前面意味着往队头靠
    对于堆(使用PriorityQueue实现):从队头到队尾按从小到大排就是最小堆(小顶堆),
    从队头到队尾按从大到小排就是最大堆(大顶堆)--->队头元素相当于堆的根节点

    PriorityQueue<int[]> pq = new PriorityQueue<>((o1, o2) -> o1[1] - o2[1]);

    第一个参数:1 第二个参数:3    负数    1、3
    第一个参数:4 第二个参数:3    正数    3、4
    小顶堆

    1. class Solution {
    2. public int[] topKFrequent(int[] nums, int k) {
    3. /*Comparator接口说明:
    4. * 返回负数,形参中第一个参数排在前面;返回正数,形参中第二个参数排在前面
    5. * 对于队列:排在前面意味着往队头靠
    6. * 对于堆(使用PriorityQueue实现):从队头到队尾按从小到大排就是最小堆(小顶堆),
    7. * 从队头到队尾按从大到小排就是最大堆(大顶堆)--->队头元素相当于堆的根节点
    8. * PriorityQueue pq = new PriorityQueue<>((o1, o2) -> o1[1] - o2[1]);
    9. *
    10. * 第一个参数:1 第二个参数:3 负数 1、3
    11. * 第一个参数:4 第二个参数:3 正数 3、4
    12. * 小顶堆
    13. * */
    14. //小顶堆
    15. PriorityQueue<int[]> pq = new PriorityQueue<>((o1, o2) -> o1[1] - o2[1]);
    16. int[] res=new int[k];
    17. HashMap map=new HashMap<>();
    18. for(int i:nums){
    19. map.put(i,map.getOrDefault(i,0)+1);
    20. }
    21. for(var x:map.entrySet()){
    22. int[] tmp=new int[2];
    23. tmp[0]=x.getKey();
    24. tmp[1]=x.getValue();
    25. pq.offer(tmp);
    26. //小顶堆
    27. while(pq.size()>k){
    28. pq.poll();
    29. }
    30. }
    31. int id=0;
    32. while(!pq.isEmpty()){
    33. int[] poll = pq.poll();
    34. res[id++]=poll[0];
    35. }
    36. return res;
    37. }
    38. }

  • 相关阅读:
    软考知识汇总--结构化开发方法
    近期的ABAP FI开发总结
    C++中的继承
    idea设置项目启动的JVM运行内存大小
    【MySQL】用户与权限管理
    Django基础入门操作 (Django-01)
    Linux多线程基础总结
    华为云图像识别服务
    windows10 + visual studio配置C/C++编译环境 和 vscode配置C/C++编译环境,以及opencv4.5.5环境
    考虑可再生能源消纳的建筑综合能源系统日前经济调度模型(Matlab代码实现)
  • 原文地址:https://blog.csdn.net/weixin_44925711/article/details/139741836