代码随想录算法训练营第十一天 | leetcode 150 239 347

    1. 逆波兰表达式求值
      解题思路:比较简单,经典的栈应用,需要注意的是判断运算符的时候要用equals进行符号匹配。处理“-”和“/”时注意数字的处理,减法可以转换成加法,将字符串类型的数字转化成整形可以使用Integer.valueOf()
    1. 滑动窗口最大值
      解题思路:使用代码随想录提供的解题方法,维护一个单调递减的队列,首先在队列里加入前k个元素,维护一个初始递减队列,然后进行数组元素判断,当要弹出数组元素和进入数组元素时,分别进行调用单调队列的函数,判断要弹出的元素是否为当前队列的最大值,和进入元素如何使单调队列发生什么变化
      代码展示:class MyQueue{ Deque<Integer> deque = new LinkedList<>(); //弹出元素时,比较当前要弹出的元素数值是否等于单调队列出口维护的最大值,如果相等则将单调队列出口最大值也弹出 //同时判断队列是否为空 void poll(int val){ if(!deque.isEmpty()&&val==deque.peek()){ deque.poll(); } } //添加元素时,如果呀添加的元素大于入口处的元素,则将入口元素弹出 //保证队列元素单调递减 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 [] res = new int[nums.length-k+1]; int num = 0; MyQueue myQueue = new MyQueue(); //先放入前k个元素在队列 for(int i = 0;i<k;i++){ myQueue.add(nums[i]); } res[num++] = myQueue.peek(); for(int i = k;i<nums.length;i++){ //判断原数组元素是否是队列最大值 myQueue.poll(nums[i-k]); //移动窗口 myQueue.add(nums[i]); //加入当前队列最大值 res[num++] = myQueue.peek(); } return res; } }
      方法二:使用双向队列模拟单调队列(二刷)
  • 347.前 K 个高频元素(二刷)
posted @ 2025-10-11 16:54  重生励志成为算法高手  阅读(12)  评论(0)    收藏  举报