[题目链接](239. 滑动窗口最大值 - 力扣(Leetcode)) 给你一个整数数组 nums
,有一个大小为 k
的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k
个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
解法:单调队列正式登场!| LeetCode:239. 滑动窗口最大值_哔哩哔哩_bilibili
class MyQueue {Deque deque = new LinkedList<>();//弹出元素时,比较当前要弹出的数值是否等于队列出口的数值,如果相等则弹出//同时判断队列当前是否为空void poll(int val) {if (!deque.isEmpty() && val == deque.peek()) {deque.poll();}}//添加元素时,如果要添加的元素大于入口处的元素,就将入口元素弹出//保证队列元素单调递减//比如此时队列元素3,1,2将要入队,比1大,所以1弹出,此时队列:3,2void add(int val) {while (!deque.isEmpty() && val > deque.getLast()) {deque.removeLast();}deque.add(val);}//队列队顶元素始终为最大值int peek() {return deque.peek();}
}class Solution {public int[] maxSlidingWindow(int[] nums, int k) {if (nums.length == 1) {return nums;}int len = nums.length - k + 1;//存放结果元素的数组int[] result = new int[len];int num = 0;//自定义队列MyQueue myQueue = new MyQueue();//先将前k的元素放入队列for (int i = 0; i < k; i++) {myQueue.add(nums[i]);}result[num++] = myQueue.peek();for (int i = k; i < nums.length; i++) {//滑动窗口移除最前面的元素,移除时判断该元素是否放入队列myQueue.poll(nums[i - k]);//滑动窗口加入最后面的元素myQueue.add(nums[i]);//记录对应的最大值result[num++] = myQueue.peek();}return result;}
}
[题目链接](347. 前 K 个高频元素 - 力扣(Leetcode)) 给你一个整数数组 nums
和一个整数 k
,请你返回其中出现频率前 k
高的元素。你可以按 任意顺序 返回答案。
解法:map + 优先队列
class Solution {public int[] topKFrequent(int[] nums, int k) {Map hashMap = new HashMap<>();for (int i = 0; i < nums.length; i++) {hashMap.put(nums[i], hashMap.getOrDefault(nums[i], 0) + 1);}// 优先队列里存储二元组(num, count), 按照队头到队尾是递减的方式存储PriorityQueue pq = new PriorityQueue<>((arry1, arry2)->arry2[1] - arry1[1]);for (Map.Entry entry : hashMap.entrySet()) {pq.add(new int[]{entry.getKey(), entry.getValue()});}int[] result = new int[k];for (int i = 0; i < k; i++) {result[i] = pq.poll()[0];}return result;}
}