欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 维修 > 算法跟练第十弹——栈与队列

算法跟练第十弹——栈与队列

2025/2/12 17:34:57 来源:https://blog.csdn.net/Yolowuwu/article/details/145578323  浏览:    关键词:算法跟练第十弹——栈与队列

文章目录

  • part01 逆波兰表达式求值
  • part02 滑动窗口最大值
  • part03 前 K 个高频元素
  • 归纳:
    • 将字符串转转换成整数:
    • LinkedList
    • Map遍历
    • 优先级队列的比较器

跟着代码随想录刷题的第十天。

代码随想录链接:代码随想录

part01 逆波兰表达式求值

题目链接:150. 逆波兰表达式求值

代码:

class Solution {public int evalRPN(String[] tokens) {Stack<Integer> stack = new Stack<>();int num;int a;int b;for(String i:tokens){if(isInt(i)){num = Integer.parseInt(i);stack.push(num);}else{b = stack.pop();a = stack.pop();int result = cal(i,a,b);stack.push(result);}}return stack.pop();}public boolean isInt(String s){//用正则表达式String b = "^-?\\d+$";return s.matches(b);}public int cal(String s,int a,int b){int result;switch(s){case "+":result = a+b;break;case "-":result = a-b;break;case "*":result = a*b;break;default:result = a/b;}return result;}
}

题解:只要遇到符号,就弹出前两个数并且进行运算,再把运算的结果存进去

代码随想录的解法:

class Solution {public int evalRPN(String[] tokens) {Deque<Integer> stack = new LinkedList();for (String s : tokens) {if ("+".equals(s)) {        // leetcode 内置jdk的问题,不能使用==判断字符串是否相等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();}
}

对比了一下,我多了判断字符串数组里面的数是不是整数的步骤

part02 滑动窗口最大值

题目链接:239. 滑动窗口最大值

代码:

class MyQueue{Deque<Integer> queue = new LinkedList<>();public void poll(int val){if(!queue.isEmpty()&&val==queue.peek()){queue.poll();}}public void add(int val){while(!queue.isEmpty()&&val>queue.getLast()){queue.removeLast();}queue.add(val);}public int peek(){return queue.peek();}
}class Solution {public int[] maxSlidingWindow(int[] nums, int k) {if(nums.length==1)return nums;MyQueue queue = new MyQueue();int len = nums.length-k+1;int[] result = new int[len];int cnt = 0;for(int i = 0;i<k;i++){queue.add(nums[i]);}result[cnt++] = queue.peek();for(int i = k;i<nums.length;i++){queue.poll(nums[i-k]);queue.add(nums[i]);result[cnt++] = queue.peek();}return result;}
}

题解:本题是自定义了一个单调队列,只在队列中保留可能成为最大值的数值。当一个数值进入到队列中时,若是前面所有值都比它小,就全部弹出。

part03 前 K 个高频元素

题目链接:347.前 K 个高频元素

代码:

class Solution {public int[] topKFrequent(int[] nums, int k) {Map<Integer,Integer> map = new HashMap<>();for(int n:nums){map.put(n,map.getOrDefault(n,0)+1);}PriorityQueue<int[]> que = new PriorityQueue<>((pair1,pair2)->pair1[1]-pair2[1]);for(Map.Entry<Integer, Integer> entry : map.entrySet()){if(que.size()<k){que.add(new int[]{entry.getKey(),entry.getValue()});}if(que.size()<k){que.poll();que.add(new int[]{entry.getKey(),entry.getValue()});}}int[] ans = new int[k];for(int i= k-1;i>=0;i--){ans[i] = que.poll()[0];}return ans;}
}

题解:先用HashMap将元素和出现频率存储起来,再用小根堆将出现频率按顺序保留,最后输出。

归纳:

将字符串转转换成整数:

int num = Integer.parseInt(i);

LinkedList

  • 获取链表最后一个元素
a.getLast();
  • 移除链表最后一个元素
a.moveLast();

Map遍历

Map.Entry<Integer, Integer> entry : map.entrySet()

优先级队列的比较器

new PriorityQueue<>((pair1, pair2) -> pair1[1] - pair2[1])

这里使用了 PriorityQueue 的构造函数,并传入了一个 Lambda 表达式 作为比较器(Comparator)。

比较器的作用是定义队列中元素的优先级规则。

Lambda 表达式 (pair1, pair2) -> pair1[1] - pair2[1]
pair1 和 pair2 是两个 int[] 类型的元素(即两个整数数组)。

pair1[1] 和 pair2[1] 分别表示这两个数组的第二个元素(索引为 1 的元素)。

pair1[1] - pair2[1] 是一个比较逻辑:

  • 如果 pair1[1] < pair2[1],结果为负数,表示 pair1 的优先级高于 pair2。

  • 如果 pair1[1] == pair2[1],结果为 0,表示两者优先级相同。

  • 如果 pair1[1] > pair2[1],结果为正数,表示 pair1 的优先级低于 pair2。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com