题解 | #滑动窗口的最大值# [P0-T2]

滑动窗口的最大值

http://www.nowcoder.com/practice/1624bc35a45c42c0bc17d17fa0cba788

在第i个数要找左侧窗口内的最大数。所以又可以单调栈套娃
唯一需要变化的就是栈上只保留窗口以内的数,所以栈上存下标以查看栈上最老的数是否还在窗口内。

再来一遍口诀:
找右边的就从右往左,找左边的从左往右
找小的就递增,找大的就递减

这里找左边最大, 那就是从左向右+递减。

import java.util.*;

// 找左边最大 -> 从左向右 (非单调)递减
public class Solution {
    public ArrayList<Integer> maxInWindows(int[] num, int size) {
      ArrayList<Integer> ans = new ArrayList<>();
      if (size > num.length || size == 0) return ans;
      
      Deque<Integer> dq = new ArrayDeque<>();
      for (int i = 0; i < num.length; i++) {
        if (!dq.isEmpty() && dq.peekFirst() <= i-size)
          dq.pollFirst();  // remove oldest number if outside window
        
        // 以满足非单调递减
        while(!dq.isEmpty() && num[i] >= num[dq.peekLast()])
          dq.pollLast();
        dq.offerLast(i);
        
        if (i >= size - 1)
          ans.add(num[dq.peekFirst()]); // dq从前向后递减 -> first最大
      }
      
      return ans;
    }
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
12-10 15:21
华为-媒体院 算法 n*16 硕士985
点赞 评论 收藏
分享
rbjjj:太杂了吧,同学,项目似乎都没深度,都是api调度耶,分层架构思想没有体现出来了,前端没有前端优化前端工程化体现,后端微服务以及分层架构没体现以及数据安全也没体现,核心再改改,注重于计算机网络,工程化,底层原理吧
点赞 评论 收藏
分享
评论
1
5
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务