【Leetcode記錄】棧與佇列
阿新 • • 發佈:2022-01-10
想到未來如果換工作/run出去找工作也需要演算法
計劃跟著程式碼隨想錄開始刷題,但是解題過程中發現程式碼隨想錄主要用C++,Java的程式碼沒有特別的友好,
於是記錄下自己做不出的題目以及微調過的程式碼
棧與佇列
150. 逆波蘭表示式求值
class Solution { public int evalRPN(String[] tokens) { Stack<Integer> stack = new Stack(); for(String token: tokens){ char c = token.charAt(0); if(!isOpe(token)){ stack.push(Integer.valueOf(token)); }else if(c == '+'){ stack.push(stack.pop() + stack.pop()); }else if(c == '-'){ stack.push(- stack.pop() + stack.pop()); // 坑一: 誰減誰,誰除誰 }else if(c == '*'){ stack.push(stack.pop() * stack.pop()); }else if(c == '/'){ int num1 = stack.pop(); int num2 = stack.pop(); stack.push( num2/num1); } } return stack.pop(); } private boolean isOpe(String s){ return s.length() == 1 & (s.charAt(0) < '0' || s.charAt(0) >'9'); // 坑二:如何判斷是否是一個普通的數字,比較麻煩,可能要用正則來判斷 //但是可以通過判斷符號,符號僅佔一位, //且符號可以簡單地計算 } }
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<Map.Entry<Integer, Integer>> queue = new PriorityQueue<>((e1, e2) -> e2.getValue() - e1.getValue()); //建大頂堆,塞進去全部,然後彈出來前k個即可 //建小頂堆的思路反而是,塞進去全部,把小的彈出來,留k個大的,但顯然大頂堆比較麻煩,需要逐個取出來剩下的 queue.addAll(map.entrySet()); int[] ans = new int[k]; for (int i = 0; i < k && !queue.isEmpty(); ++i){ ans[i] = queue.poll().getKey(); } return ans; } }
小頂堆
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<Map.Entry<Integer, Integer>> queue = new PriorityQueue<>((e1,e2) -> e1.getValue() - e2.getValue()); //建大頂堆,塞進去全部,然後彈出來前k個即可 //建小頂堆的思路反而是,塞進去全部,把小的彈出來,留k個大的,但顯然大頂堆比較麻煩,需要逐個取出來剩下的 queue.addAll(map.entrySet()); int[] ans = new int[k]; while(queue.size()>k){ queue.poll(); } for(int i = 0 ; i < k ;i++){ ans[i] = queue.poll().getKey(); } return ans; } }