一.双向队列
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param num int整型一维数组
* @param size int整型
* @return int整型ArrayList
*/
public ArrayList<Integer> maxInWindows (int[] num, int size) {
// write code here
//创建一个数组用来存储
ArrayList<Integer> list = new ArrayList<>();
/**
* size大于数组的长度返回空数组,
* 数组长度为0返回空数组,
* size为0返回空数组
*/
if (size > num.length || num.length == 0 || size == 0)
return list;
//创建一个双向队列
ArrayDeque<Integer> deque = new ArrayDeque<>();
//先遍历第一个窗口
for (int i = 0; i < size; i++) {
while (!deque.isEmpty() && num[deque.peekLast()] < num[i]) {
deque.pollLast();
}
deque.add(i);
}
//再遍历后续的窗口
for (int i = size; i < num.length; i++) {
list.add(num[deque.peekFirst()]);
while (!deque.isEmpty() && deque.peekFirst() < (i - size + 1)) {
deque.pollFirst();
}
while (!deque.isEmpty() && num[deque.peekLast()] < num[i]) {
deque.pollLast();
}
deque.add(i);
}
//滑动窗口的最大值都在尾部
list.add(num[deque.pollFirst()]);
return list;
}
}
二.暴力法
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param num int整型一维数组
* @param size int整型
* @return int整型ArrayList
*/
public ArrayList<Integer> maxInWindows (int[] num, int size) {
// write code here
ArrayList<Integer> list = new ArrayList<>();
if (size > num.length || size == 0 || num.length == 0)
return list;
/**
* 保证i下标不会越界
*/
for (int i = 0; i <= num.length - size; i++) {
//定义一个默认变量
int max = 0;
/**
* j每次遍历的长度刚好是size,
* 在size区域内找到最大值
*/
for (int j = i; j < i + size; j++) {
if (num[j] > max)
max = num[j];
}
list.add(max);
}
return list;
}
}