题目描述
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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; } }