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;}
}