剑指offer——滑动窗口的最大值

  给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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 import java.util.ArrayList;
 2 public class Solution {
 3     public ArrayList<Integer> maxInWindows(int [] num, int size)
 4     {
 5         ArrayList<Integer> list=new ArrayList<>();
 6         int max=Integer.MIN_VALUE;
 7         int maxindex=-1;
 8         if(size==0)
 9             return list;
10         for(int i=0;i<num.length-size+1;i++){
11             //判断是否在本次窗口内
12             if(maxindex<i){
13                 max=Integer.MIN_VALUE;
14                 //遍历窗口,得到最大值
15                 for(int j=i;j<i+size;j++){
16                     if(num[j]>max){
17                         //保存最大值
18                         max=num[j];
19                         //保存最大值的下标
20                         maxindex=j;
21                     }
22                 }
23             }else{
24                 //窗口的最后一位数和旧最大值比较
25                 if(num[i+size-1]>max){
26                     max=num[i+size-1];
27                     maxindex=i+size-1;
28                 }
29             }
30             list.add(max);
31         }
32             return list;
33     }
34 }

 

posted @ 2019-03-31 10:11  空格空格  阅读(172)  评论(0编辑  收藏  举报