239.滑动窗口最大值
题目:239. 滑动窗口最大值 - 力扣(LeetCode)
思路:把每个数字记录下来,然后找出最大的不久行了嘛,就是每次取出窗口内的最大值,存入到一个数组中
尝试
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
int[] result = new int[nums.length];
int start = 0;
int end = k-1;
int count = 0;
for(;k-1<nums.length;k++){
result[count] = getMax(start,k,nums);
count++;
start++;
}
return result;
}
public int getMax(int start,int end,int[] nums){
if (nums == null || start < 0 || end >= nums.length || start > end) {
throw new IllegalArgumentException("Invalid arguments");
}
int max = Integer.MIN_VALUE; // 初始化为最小可能的整数
// 遍历窗口内的元素,找到最大值
for (int i = start; i <= end; i++) {
if (nums[i] > max) {
max = nums[i];
}
}
return max;
}
}
429 看视频后
🍉视频里推导时,队列里存的是元素,代码中存的是元素索引!
🍉判断头部元素时,要用【i - k + 1】,而不是[ n - k + 1]
429晚上
🍉从队列中取出的是索引!所以要用nums[ ]去找到元素再比较大小
小结
- ArrayDeque 是一个基于数组实现的双端队列
-
ArrayDeque<Integer> deque = new ArrayDeque<>(); // 创建一个整型的双端队列 deque.peekLast(); // 查看队列尾部的元素,但不移除它。如果队列为空,返回null。 deque.pollLast(); // 移除并返回队列尾部的元素。如果队列为空,返回null。 int i = 10; // 假设我们有一个整数值i deque.offer(i); // 将元素i添加到队列尾部。如果成功,返回true。 deque.poll(); // 移除并返回队列头部的元素。如果队列为空,返回null。 deque.peek(); // 查看队列头部的元素,但不移除它。如果队列为空,返回null。
- 双端队列,一个while循环保证队列的头节点在窗口内,一个while循环保证放进去的数字比末尾都大
- 第一个窗口之后,每滑动一步,就把列表头节点存入在结果集中
347.前K个高频元素
题目:347. 前 K 个高频元素 - 力扣(LeetCode)
思路:先存在队列里面,最后用for循环弹出K次,存入到结果数组中。——存在队列时,用单调队列吗?还是说用自带排序的队列?但是排序是按照元素来排的,我不能往里面直接存元素或者是索引。用元素和出现次数组成键值对,搞个优先级队列,队列里面放入次数,也不对。
我排序的时候,用的是频率,返回的时候,要返回元素,所以两者应该有个映射表,或者是我直接按次序插入到数组中,大的放前面,小的放后面。
🍕怎么解决排序值与返回值的映射?🍉用map,就是键值对!
🍕Java中怎么实现优先级队列?
小结
- 🍉Java的优先级队列是priorityQueue
- 定义存放数组的优先级队列,数组长度为2,用于存储元素、元素出现频率
- for循环,遍历传入的数组,记录所有元素出现的频率到map中
- for循环,遍历map,把键值对转化为数组,存入优先级队列中,通过if函数,保证队列只有k个元素
- for循环,取出优先级队列中的元素,赋值给结果数组返回