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