【剑指Offer】65、滑动窗口的最大值

题目描述

给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。

题解一:循环遍历
 1 public static ArrayList<Integer> maxInWindows(int[] num, int size) {
 2         ArrayList<Integer> list = new ArrayList<>();
 3         if(num.length<size||size<=0){
 4             return list;
 5         }
 6         for(int i=0;i<num.length-size+1;i++){
 7             int temp=num[i];
 8             for(int j=0;j<size;j++){
 9                 if(num[i+j]>=temp){
10                     temp=num[i+j];
11                 }
12             }
13             list.add(temp);
14         }
15         return list;
16     }
题解二:队列
 1 public static ArrayList<Integer> maxInWindows01(int [] num, int size) {
 2         ArrayList<Integer> list = new ArrayList<>();
 3         if(num.length<size||size<=0){
 4             return list;
 5         }
 6         //双端队列,用来记录每个窗口的最大值下标
 7         LinkedList<Integer> queue = new LinkedList<>();
 8         for (int i = 0; i < num.length; i++) {
 9             while (!queue.isEmpty() && num[queue.peekLast()] < num[i]) {
10                 queue.pollLast();
11             }
12             queue.addLast(i);
13             //判断队首元素是否过期
14             if (queue.peekFirst() == i - size) {
15                 queue.pollFirst();
16             }
17             //向list列表中加入元素
18             if (i >= size - 1) {
19                 list.add(num[queue.peekFirst()]);
20             }
21         }
22         return list;
23     }

测试:

1 public static void main(String[] args) {
2         int[] num={2,3,4,2,6,2,5,1};
3         int size=3;
4         ArrayList<Integer> list = maxInWindows01(num, size);
5         String string = list.toString();
6         System.out.println(string);
7     }
8 输出:[4, 4, 6, 6, 6, 5]

猜你喜欢

转载自www.cnblogs.com/Blog-cpc/p/12383848.html