当前位置: 首页 > ops >正文

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

150. 逆波兰表达式求值

思路:遇到数字入栈,遇到字符,出栈中的两个数字,然后计算,得到的结果再入栈。

class Solution {public int evalRPN(String[] tokens) {Stack<Integer> stack = new Stack();for(String s : tokens){if ("+".equals(s)) {    stack.push(stack.pop() + stack.pop());      } else if ("-".equals(s)) {stack.push(-stack.pop() + stack.pop());} else if ("*".equals(s)) {stack.push(stack.pop() * stack.pop());} else if ("/".equals(s)) {int temp1 = stack.pop();int temp2 = stack.pop();stack.push(temp2 / temp1);} else {stack.push(Integer.valueOf(s));}}return stack.pop();}
}

 239. 滑动窗口最大值(难)

代码录思路:自己diy一个数据结构,其类似于双端队列。扫描前k个元素,入队时,先与队尾元素比较,若队尾元素比要添加的元素小,则将队尾元素排出(这可以保证队头位置的元素一直为最大元素)。当窗口后移时,要将窗口前边元素移出,则需要判断窗口移除元素是否为队头元素,若是,则移除队头元素,若不是,则代表已经移除。将窗口后边元素移入时调用入队操作即可。

class Myqueue{Deque<Integer> deque;public Myqueue(){deque = new LinkedList<>();}void add(int num){while(!deque.isEmpty() && num > deque.getLast()){deque.pollLast();}deque.add(num);}void delete(int num){if(!deque.isEmpty() && deque.getFirst() == num){deque.pollFirst();}}int getMax(){return deque.peek();}
}class Solution {public int[] maxSlidingWindow(int[] nums, int k) {int[] res = new int[nums.length-k+1];Myqueue myqueue = new Myqueue();for(int i = 0;i < k;i++){myqueue.add(nums[i]);}res[0] = myqueue.getMax();for(int i = k; i < nums.length;i++){//先移除窗口头部元素;myqueue.delete(nums[i-k]);//加入下一个元素;myqueue.add(nums[i]);//获取最大值res[i-k+1] = myqueue.getMax();}return res;}
}

 347.前 K 个高频元素(难)

代码录思路:先用map记录元素及其出现的次数,然后用优先级队列(小顶堆),记录前k个高频元素。

代码中好多方法都不熟练

class Solution {public int[] topKFrequent(int[] nums, int k) {Map<Integer,Integer> map = new HashMap<Integer, Integer>();//遍历数组,得到每个元素出现的次数for (int num : nums) {map.put(num, map.getOrDefault(num, 0) + 1);}PriorityQueue<int[]> pq = new PriorityQueue<>((value1,value2)->value1[1]-value2[1]);//获取出现次数最多的k个元素,放到pq中for(Map.Entry<Integer, Integer> value : map.entrySet() ) {if(pq.size() < k) {//元素少于k个时,直接加入pq.add(new int[] {value.getKey(),value.getValue()});}else {//元素大于k个时分情况if(value.getValue() > pq.peek()[1]) {//元素出现次数比队列中出现次数最少的多时,加入pq.poll();pq.add(new int[] {value.getKey(),value.getValue()});}}}int[] res = new int[k];for(int i = k-1;i>=0;i--) {res[i] = pq.poll()[0];}return res;}
}

鉴于作者水平有限,文章可能存在错误

如有指正,十分感谢

http://www.xdnf.cn/news/12868.html

相关文章:

  • Gartner 人力优化策略分析报告学习心得
  • SEO长尾关键词增效策略
  • 大模型面试题:大模型训练过程中如何估计显卡利用率?
  • 【ESP32】ESP-IDF开发 | 低功耗蓝牙开发 | 蓝牙空中串口 + 服务端和客户端例程
  • LlamaIndex 工作流 分支和循环
  • AI是如何换装的?
  • 三维图形、地理空间、激光点云渲染技术术语解析笔记
  • 压缩机PCB Layout注意事项
  • Java并发编程-理论基础
  • Context API 应用与局限性
  • 非Root用户启动SSH服务经验小结
  • (四)Linux性能优化-CPU-软中断
  • 数据类型 -- 字符串
  • python3GUI--基于PyQt5+DeepSort+YOLOv8智能人员入侵检测系统(详细图文介绍)
  • 【razor】x264 在 的intra-refresh和IDR插帧
  • Visual Studio 2022打包程序流程
  • BIO通讯
  • 【量化】策略交易 - 均线策略(Moving Average Strategy)- 代码增强版本
  • Vue作用域插槽
  • 楠溪江诗意传承:李文照笔下的山水印记
  • Linux下的进程调度机制
  • 一文看懂Spring Boot集成智谱清言 AI最佳实践
  • Spring AOP执行原理源码解析
  • 上位机知识篇---dialoutuucp组
  • Windows设置之网络路由
  • 手写RPC框架<一> SPI机制
  • 华为云之使用云服务器搭建Leanote云笔记本【玩转华为云】
  • MS8911S/8921S/8922M/8931S 是一款具有内部迟滞的高速比较器
  • spring task定时任务快速入门
  • 【LangChain4J】LangChain4J 第四弹:RAG 的多种实现方式