个人博客主页: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;
}
}