java LeetCode - 滑动窗口maxmum滑动窗口最大值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java LeetCode - 滑动窗口maxmum滑动窗口最大值相关的知识,希望对你有一定的参考价值。

//利用双端队列来实现,其中保存的是数字下标而非数字本身,双端队列中需要是从大到小有序的数字,那么每次窗口中最大值就是队列头部的元素。保持每次插入都将带插入数字从后前遍历插入到合适的位置并且去掉所有小于该数字的队列中其他数字
public List<Integer> maxSlidingWindow(int[] nums,int k){
  List<Integer> res = new ArrayList<Integer>();
  Deque<Integer> q = new Deque<>();
  for(int i = 0 ; i < nums.length; i++){
    if(!q.isEmpty() && q.getFirst()<=(i-k)) q.removeFirst();
    while(!q.isEmpty() && nums[q.getLast()] <nums[i]) q.removeLast();
    q.addLast(i);
    if(i>=k-1) res.add(nums[q.getFirst()]);//之所以要有i>=k-1限制是因为保证是已经处理完前k个元素才开始往结果集里加的。
  }
  return res;
}
//利用大顶堆实现,先利用最前面k个元素建堆然后每次窗口中最大值都是插入新的元素之后堆顶元素。对于新的元素如果大于堆顶元素就是插入堆,如果小于就直接排除。
//堆中存储的还是位置索引而非真实值,因为需要比较堆顶的元素是否需要移除了.
public List<Integer> maxSlidingWindow(int[] nums,int k){
  List<Integer> res = new ArrayList<>();
  PriorityQueue<Integer> q = new PriorityQueue<>();
  for(int i = 0 ; i < nums.length ; i++){
    while(!q.isEmpty() && i-k>=q.peek()) q.remove();
    q.add(i);
    if(i>=k-1) res.add(nums[q.peek()]);
  }
  return res;
}

以上是关于java LeetCode - 滑动窗口maxmum滑动窗口最大值的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 239. 滑动窗口最大值(最大值的重新利用,Java)

LeetCode 239. 滑动窗口最大值(最大值的重新利用,Java)

LeetCode 239. 滑动窗口最大值(最大值的重新利用,Java)

leetcode424 替换后的最长重复字符 java题解

LeetCode-滑动窗口滑动窗口最大值

leetcode之滑动窗口算法小结