Leetcode239. 滑动窗口最大值
注意:×
- 注意这个单调队列的写法,其实不难
- 注意在maxSliding函数的位置的
i<k-1
以及下面的i-k-1
- 注意在ArrayList数据结构中get()和indexOf()方法的区别
- get(int index)方法:作用: 返回ArrayList中指定索引位置的元素
- indexOf(Object o)方法:作用: 返回指定元素在ArrayList中第一次出现的索引位置
public int[] maxSlidingWindow(int[] nums, int k) {
MonotonicQueue mq = new MonotonicQueue();
ArrayList<Integer> res = new ArrayList<>();
for (int i = 0; i < nums.length; i++) {
if (i < k - 1) {
mq.push(nums[i]);
} else {
mq.push(nums[i]);
res.add(mq.getMax());
mq.pop(nums[i - k + 1]);
}
}
// 需要转成 int[] 数组再返回
int[] arr = new int[res.size()];
for (int i = 0; i < res.size(); i++) {
arr[i] = res.get(i);
}
return arr;
}
class MonotonicQueue {
private LinkedList<Integer> ll = new LinkedList<Integer>();
public void push(int num) {
while (!ll.isEmpty() && num > ll.getLast()) {
ll.pollLast();
}
ll.addLast(num);
}
public void pop(int num) {
if (num == ll.getFirst()) {
ll.pollFirst();
}
}
public int getMax() {
return ll.getFirst();
}
}
Leetcode 347.前 K 个高频元素
注意:×
- 纯抄的Labuladong,学习了优先队列的写法
PriorityQueue<Map.Entry<Integer,Integer>> pq = new PriorityQueue<>((e1,e2)->{return e1.getValue().compareTo(e2.getValue());});
这个里面的Entry的做法- 注意遍历Map所有键值对的方式
public int[] topKFrequent(int[] nums, int k) {
// 1.使用HashMap记录每个字符出现的次数
HashMap<Integer, Integer> valToFreq = new HashMap<>();
for (int num :
nums) {
valToFreq.put(num, valToFreq.getOrDefault(num, 0) + 1);
}
// 2.遍历HashMap将键值对送入优先队列中
PriorityQueue<Map.Entry<Integer,Integer>> pq = new PriorityQueue<>((e1,e2)->{return e1.getValue().compareTo(e2.getValue());});
for (Map.Entry<Integer,Integer> e:valToFreq.entrySet()){
pq.offer(e);
if (pq.size()>k){
pq.poll();
}
}
// 3.优先队列转成int[]
int[] res = new int[k];
for (int i = k-1; i >=0; i--) {
res[i] = pq.poll().getKey();
}
return res;
}