个人博客主页:http://myblog.nxx.nx.cn
代码GitHub地址:https://github.com/nx-xn2002/Data_Structure.git
Day13
239. 滑动窗口最大值
题目链接:
https://leetcode.cn/problems/sliding-window-maximum/
题目描述:
给你一个整数数组 nums
,有一个大小为 k
的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k
个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
思路:
这题和昨天的题目是一样的,在 Java 中这种题统一使用优先队列来做即可,通过优先队列来找到滑动窗口中的最大值,而当发现队首不在滑动窗口范围内时,将队首弹出。
代码实现:
class Solution {public int[] maxSlidingWindow(int[] nums, int k) {int n = nums.length;PriorityQueue<int[]> pq = new PriorityQueue<int[]>((a, b) -> {return a[0] != b[0] ? b[0] - a[0] : b[1] - a[1];});for (int i = 0; i < k; ++i) {pq.offer(new int[] { nums[i], i });}int[] ans = new int[n - k + 1];ans[0] = pq.peek()[0];for (int i = k; i < n; ++i) {pq.offer(new int[] { nums[i], i });while (pq.peek()[1] <= i - k) {pq.poll();}ans[i - k + 1] = pq.peek()[0];}return ans;}
}
347. 前 K 个高频元素
题目链接:
https://leetcode.cn/problems/top-k-frequent-elements/
题目描述:
给你一个整数数组 nums
和一个整数 k
,请你返回其中出现频率前 k
高的元素。你可以按 任意顺序 返回答案。
思路:
这题也和昨天一样,用哈希表存储元素出现频率,然后通过优先队列来进行排序并弹出
代码实现:
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<>((item1, item2) -> (item2[1] - item1[1]));for (Integer integer : map.keySet()) {pq.add(new int[]{integer, map.get(integer)});}int[] res = new int[k];for (int i = 0; i < k; i++) {res[i] = pq.poll()[0];}return res;}
}