题目描述

给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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]}。
 
 
 
题目链接:
 
 
 
分析:
left,right分别记录窗口左右边界。
max记录当前窗口最大值。
当max出了左边界时,从窗口内重新找最大值。
 
 
import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> maxInWindows(int [] num, int size)
    {
        //窗口大小为0时,数组为空
        if(size == 0){
            return new ArrayList<>();
        }
        int max = 0;
        int pos = 0;
        int left = 0;
        ArrayList<Integer> list = new ArrayList<>();
        for(int right=0;right<num.length;right++){
            //如果比当前最大值还要大,更新最大值
            if(num[right]>=max){
                max = num[right];
                pos = right;
            }
            if(right >= size - 1){
                list.add(max);
                left++;
                //当当前最大值不在窗口时,从当前窗口中重新找最大值
                if(pos < left && left < num.length){
                    pos = left;
                    max = num[left];
                    for(int i = left + 1;i <= right;i++){
                        if(num[i]>max){
                            max = num[i];
                            pos = i;
                        }
                    }
                }
            }
        }
        return list;
    }
}

 

posted on 2020-06-14 00:26  MoonBeautiful  阅读(112)  评论(0编辑  收藏  举报