滑动窗口最大值
题目 :给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回 滑动窗口中的最大值 。
分析: 用单调队列, 单调队列特性 里面所有元素都是单调递增或递减, push()操作 while(队列不为空 且 x大于队尾元素) removeLast(). pop() 操作 if(队列不为空 且 x等于peek元素) poll()
代码如下
class MyDeque { Deque<Integer> deque = new LinkedList<>(); public void push(int x){ while(!deque.isEmpty()&&x>deque.peekLast()){ deque.removeLast(); } deque.offer(x); } public void pop(int x){ if(!deque.isEmpty()&&x==deque.peek()){ deque.poll(); } } public int peek(){ return deque.peek(); } } class Solution { public int[] maxSlidingWindow(int[] nums, int k) { if(nums.length<2) return nums; int[] res= new int[nums.length-k+1]; int num=0; MyDeque myDeque= new MyDeque(); for(int i =0;i<k;i++){ myDeque.push(nums[i]); } res[num++]=myDeque.peek(); for(int i=k;i<nums.length;i++){ myDeque.pop(nums[i-k]); myDeque.push(nums[i]); res[num++]=myDeque.peek(); } return res; } }
前 K 个高频元素
题目 给你一个整数数组 nums
和一个整数 k
,请你返回其中出现频率前 k
高的元素。你可以按 任意顺序 返回答案。
分析 用小顶堆(父节点小于左右节点 每次pop都是从头部pop) 维护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<>((i1,i2)->i1[1]-i2[1]); for(Map.Entry<Integer,Integer> entry:map.entrySet()){ if(pq.size()<k){ pq.add(new int[]{entry.getKey(),entry.getValue()}); }else { if(entry.getValue()>pq.peek()[1]){ pq.poll(); pq.add(new int[]{entry.getKey(),entry.getValue()}); } } } int[] ans = new int[k]; for(int i=k-1;i>=0;i--){ ans[i]=pq.poll()[0]; } return ans; } }
标签:deque,pq,nums,int,最大值,随想录,new,day13,滑动 From: https://www.cnblogs.com/Liu5419/p/17162276.html