239. 滑动窗口最大值
思路: 好难,看了思路也一知半解
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
// 窗口个数
int[] res = new int[nums.length - k + 1];
LinkedList<Integer> queue = new LinkedList<>();
// 遍历数组中元素,right表示滑动窗口右边界
for(int right = 0; right < nums.length; right++) {
// 如果队列不为空且当前考察元素大于等于队尾元素,则将队尾元素移除。
// 直到,队列为空或当前考察元素小于新的队尾元素
while (!queue.isEmpty() && nums[right] >= nums[queue.peekLast()]) {
queue.removeLast();
}
// 存储元素下标
queue.addLast(right);
// 计算窗口左侧边界
int left = right - k +1;
// 当队首元素的下标小于滑动窗口左侧边界left时
// 表示队首元素已经不再滑动窗口内,因此将其从队首移除
if (queue.peekFirst() < left) {
queue.removeFirst();
}
// 由于数组下标从0开始,因此当窗口右边界right+1大于等于窗口大小k时
// 意味着窗口形成。此时,队首元素就是该窗口内的最大值
if (right +1 >= k) {
res[left] = nums[queue.peekFirst()];
}
}
return res;
}
}
347. 前 K 个高频元素
思路:感觉不是很难,主要是coding要好好写
class Solution {
public int[] topKFrequent(int[] nums, int k) {
//设置一个map集合,key存放数字,value存放出现次数
Map<Integer,Integer> map = new HashMap<>();
//统计出现次数
for(int num:nums){
map.put(num,map.getOrDefault(num,0)+1);
}
//建立一个大根堆,用来存放key值,堆内元素按照key对应的value值从大到小排序
PriorityQueue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>(){
public int compare(Integer a,Integer b){
return map.get(a) - map.get(b);
}
});
//将map中的数字,插入到大根堆中
for(Integer key:map.keySet()){
if(queue.size() < k){
queue.add(key);
}else if(map.get(key) > map.get(queue.peek())){
queue.poll();
queue.add(key);
}
}
//将大根堆中的k个数字放到数组中
int [] res = new int[k];
int index = 0;
while(!queue.isEmpty()){
res[index++] = queue.poll();
}
return res;
}
}