剑指offer59a 滑动窗口的最大值
这题没做过类似的,挺难的。
核心思想是,使用一个双端队列记录滑动窗口中的潜在最大值。然后窗口滑动时,将队头存储的最大元素加入结果List即可。
每次遍历的节点都是新窗口最右边的节点。
import java.util.ArrayList; import java.util.ArrayDeque; public class Solution { public ArrayList<Integer> maxInWindows(int [] num, int size) { ArrayList<Integer> ans = new ArrayList<>(); if(num==null||num.length<size|size<1) return ans; ArrayDeque<Integer> maxQ = new ArrayDeque<>(); for(int i=0;i<size;i++){ while(!maxQ.isEmpty()&&num[i]>num[maxQ.getLast()]) maxQ.removeLast(); maxQ.addLast(i); } ans.add(num[maxQ.getFirst()]); for(int i=size;i<num.length;i++){ while(!maxQ.isEmpty()&&num[i]>num[maxQ.getLast()]) maxQ.removeLast(); maxQ.addLast(i); if(maxQ.getFirst()<=i-size) maxQ.removeFirst(); ans.add(num[maxQ.getFirst()]); } return ans; } }
运行时间:28ms
占用内存:9248k

浙公网安备 33010602011771号