解题思路:分别在所有的滑动窗口里找最大值,时间复杂度O(N),空间复杂度O(N)
import java.util.*;
public class Solution {
public ArrayList<Integer> maxInWindows(int [] num, int size) {
int length = num.length - size;
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i <= length; i++) {
list.add(getMax(num, i, i + size));
}
return list;
}
private int getMax(int [] num, int start, int end) {
int max = num[start];
for (int i = start + 1; i < end; i++) {
if (max < num[i]) {
max = num[i];
}
}
return max;
}
}
对特殊情况就不用遍历找最大值了,下面是对上面做的优化
import java.util.*;
public class Solution {
public ArrayList<Integer> maxInWindows(int [] num, int size) {
if (num == null || num.length <= 0 || size <= 0 || size > num.length) {
return new ArrayList<>();
}
int length = num.length - size;
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i <= length; i++) {
if (!list.isEmpty()) {
//如果窗口的下一个元素比上一次窗口的最大值大
//那么下一次窗口的最大值就是num[i+size-1],不用去遍历找了
if (list.get(list.size() - 1) <= num[i + size - 1]) {
list.add(num[i + size - 1]);
} else {
//如果窗口的下一个元素比窗口的第一个元素大且比最大值小
//那么窗口的最大值还是原来的最大值
if (num[i + size - 1] >= num[i - 1]) {
list.add(list.get(list.size() - 1));
} else {
//如果窗口的下一个元素比窗口的第一个元素小,且比窗口的最大值小
//又因为窗口的第一个值不是最大值,所以最大值还是原来的
if (!list.get(list.size() - 1).equals(num[i - 1])) {
list.add(list.get(list.size() - 1));
} else {
//如果窗口的下一个元素比窗口的第一个元素小,且比窗口的最大值小
//又因为窗口的第一个值是最大值,最大值过期,需要重新找最大值
list.add(getMax(num, i, i + size));
}
}
}
} else {
list.add(getMax(num, i, i + size));
}
}
return list;
}
private int getMax(int [] num, int start, int end) {
int max = num[start];
for (int i = start + 1; i < end; i++) {
if (max < num[i]) {
max = num[i];
}
}
return max;
}
}