机器学习算法Python源码深度解析:从统计基础到工程实践
2026/9/16 6:38:17
代码随想录-栈
刚开始看到题目的时候有点懵,不太了解逆波兰表达式,其实就是后缀表达式,是计算机的思考运行模式。这道题很适合用栈来解决,思路:
class Solution { public int evalRPN(String[] tokens) { Stack<Integer> st = new Stack(); for (int i = 0; i < tokens.length; i++) { if ("+".equals(tokens[i]) || "-".equals(tokens[i]) || "*".equals(tokens[i]) || "/".equals(tokens[i])) { int number1 = st.pop(); int number2 = st.pop(); if ("+".equals(tokens[i])) st.push(number1 + number2); if ("-".equals(tokens[i])) st.push(number2 - number1); if ("*".equals(tokens[i])) st.push(number2 * number1); if ("/".equals(tokens[i])) st.push(number2 / number1); } else { st.push(Integer.valueOf(tokens[i])); } } return st.pop(); } }做这道题目时,出了两种错误
int number1 = st.pop(); // 弹出并返回栈顶元素 // 或 int number1 = st.peek(); // 仅返回栈顶元素(不弹出)另外,在探索学习的过程中,AI还指出了当前代码太low了,存在两个可以优化的点:
优化完虽然代码行数变多了,但是执行效率提高了很多
class Solution { public int evalRPN(String[] tokens) { Stack<Integer> st = new Stack(); for (String token : tokens) { switch (token) { case "+" : st.push(st.pop() + st.pop()); break; case "*" : st.push(st.pop() * st.pop()); break; case "-" : int number1 = st.pop(); int number2 = st.pop(); st.push(number2 - number1); break; case "/" : int div1 = st.pop(); int div2 = st.pop(); st.push(div2 / div1); break; default : st.push(Integer.parseInt(token)); } } return st.pop(); } }这道题看起来感觉思路挺清晰的,无非就是每滑动一次找出窗口范围内的最大值,但实现起来真是复杂,看了视频讲解,独立写的时候还卡住好多次,思路:
class Solution { public int[] maxSlidingWindow(int[] nums, int k) { ArrayDeque<Integer> deque = new ArrayDeque(); int n = nums.length; int[] result = new int[n - k + 1]; int index = 0; for (int i = 0; i < n; i++) { while (!deque.isEmpty() && deque.peek() < i - k + 1) { deque.poll(); } while (!deque.isEmpty() && nums[i] > nums[deque.peekLast()]) { deque.pollLast(); } deque.offer(i); if (i >= k - 1) { result[index++] = nums[deque.peek()]; } } return result; } }拿到题目想到了用map结构来记录每个元素出现的频次,然后再根据map中,最大的前K个value对应的key,从而得出结果。但根据value排序取对应的key好像挺复杂的,不知道怎么实现,去看了讲解后,才意识到需要用优先级队列这个数据结构,思路:
class Solution { public int[] topKFrequent(int[] nums, int k) { Map<Integer, Integer> map = new HashMap<>(); for (int num : nums) { map.put(num, map.getOrDefault(num, 0) + 1); } PriorityQueue<int[]> pq = new PriorityQueue<>((pair1, pair2) -> pair1[1] - pair2[1]); for (Map.Entry<Integer, Integer> entry : map.entrySet()) { if (pq.size() < k) { pq.add(new int[]{entry.getKey(), entry.getValue()}); } else { if (entry.getValue() > pq.peek()[1]) { pq.poll(); pq.add(new int[]{entry.getKey(), entry.getValue()}); } } } int[] result = new int[k]; for (int i = k - 1; i >= 0; i--) { result[i] = pq.poll()[0]; } return result; } }