HOT100–Day25–84. 柱狀圖中最大的矩形,215. 數組中的第K個最大元素,347. 前 K 個高頻元素
每日刷題系列。今天的題目是《力扣HOT100》題單。
題目類型:棧,堆。
84. 柱狀圖中最大的矩形
思路:
class Solution {public int largestRectangleArea(int[] heights) {int n = heights.length;int[] left = new int[n];Deque<Integer> stack = new ArrayDeque<>();for (int i = 0; i < n; i++) {int h = heights[i];while (!stack.isEmpty() && heights[stack.peek()] >= h) {stack.pop();}left[i] = stack.isEmpty() ? -1 : stack.peek();stack.push(i);}int[] right = new int[n];stack.clear();for (int i = n - 1; i >= 0; i--) {int h = heights[i];while (!stack.isEmpty() && heights[stack.peek()] >= h) {stack.pop();}right[i] = stack.isEmpty() ? n : stack.peek();stack.push(i);}int res = 0;for (int i = 0; i < n; i++) {res = Math.max(res, heights[i] * (right[i] - left[i] - 1));}return res;}
}
215. 數組中的第K個最大元素
思路:
class Solution {public int findKthLargest(int[] nums, int k) {PriorityQueue<Integer> h = new PriorityQueue<>((a, b) -> Integer.compare(b, a));for (int x : nums) {h.offer(x);}while (k-- > 1) {h.poll();}return h.peek();}
}
347. 前 K 個高頻元素
思路:
// Comparator接口說明:返回負數,形參中第一個參數排在前面;返回正數,形參中第二個參數排在前面
// lambda 表達式設置優先級隊列從大到小存儲 o1 - o2 為從小到大,o2 - o1 反之
class Solution {public int[] topKFrequent(int[] nums, int k) {int[] res = new int[k];Map<Integer, Integer> map = new HashMap<>();// 沒想到這里竟然可以<int[]>,一直以為這里只能放包裝類PriorityQueue<int[]> pq = new PriorityQueue<>((o1, o2) -> o1[1] - o2[1]);int n = nums.length;// Map<元素,出現次數>統計for (int i = 0; i < n; i++) {map.put(nums[i], map.getOrDefault(nums[i], 0) + 1);}// 這里可以寫成for(var entry : Map.entrySet()),不知道從哪個版本開始有的特性,可以用varfor (Map.Entry<Integer, Integer> entry : map.entrySet()) {int[] e = new int[2];e[0] = entry.getKey();e[1] = entry.getValue();// 先添加到小頂堆,會自動排序pq.offer(e);// 如果元素大于K個,隊頭出隊,也就是最小值出隊if (pq.size() > k) {pq.poll();}}// 循環結束之后,小頂堆的k個元素就是答案,放到res[]數組里面for (int i = 0; i < k; i++) {res[i] = pq.poll()[0];}return res;}
}