[关闭]
@ysner 2021-10-25T21:13:42.000000Z 字数 992 阅读 887

LeetCode239—滑动窗口最大值

双端队列 单调队列


第一次提交的代码:(堆)

  1. class Solution
  2. {
  3. public int[] maxSlidingWindow(int[] nums, int k)
  4. {
  5. int n=nums.length;
  6. int[] ans=new int[n-k+1];
  7. Queue<int[]> Q=new PriorityQueue<>((a,b)->a[0]==b[0]?b[1]-a[1]:b[0]-a[0]);//比较器写法,若->右边的数大于0,则交换。
  8. //原来队列可以把数组作为元素
  9. for(int i=0;i<k;i++) Q.offer(new int[]{nums[i],i});//在队列中插入数组的姿势
  10. ans[0]=Q.peek()[0];
  11. for(int i=k;i<n;i++)
  12. {
  13. Q.offer(new int[]{nums[i],i});
  14. while(Q.peek()[1]<=i-k) Q.poll();//已经不在窗口内的数不断出队即可。
  15. ans[i-k+1]=Q.peek()[0];
  16. }
  17. return ans;
  18. }
  19. }

第二次提交的代码:(双端队列+单调队列)

  1. class Solution
  2. {
  3. public int[] maxSlidingWindow(int[] nums, int k)
  4. {
  5. int n=nums.length;
  6. int[] ans=new int[n-k+1];
  7. Deque<Integer> Q=new ArrayDeque<>();//Deque不是接口,ArrayDeque、LinkedList等才是
  8. for(int i=0;i<k;i++)
  9. {
  10. while(!Q.isEmpty()&&nums[Q.peekLast()]<=nums[i]) Q.pollLast();//维护一个从大到小的单调队列(不过内容是数字的位置编号)
  11. Q.offerLast(i);
  12. }
  13. ans[0]=nums[Q.peekFirst()];
  14. for(int i=k;i<n;i++)
  15. {
  16. while(!Q.isEmpty()&&nums[Q.peekLast()]<=nums[i]) Q.pollLast();
  17. Q.offerLast(i);
  18. while(Q.peekFirst()<=i-k) Q.pollFirst();//出了窗口的出队
  19. ans[i-k+1]=nums[Q.peekFirst()];
  20. }
  21. return ans;
  22. }
  23. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注