滑动窗口(Java)
题目一:给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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]}。
代码:
import java.util.ArrayList;
/**
* @desc 滑动窗口的最大值
* @author zhaoliang
* @date 20200420
*/
public class Main59 {
//给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。
// 例如,如果输入数组{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]}。
public ArrayList<Integer> maxInWindows(int [] num, int size)
{
ArrayList<Integer> ans =new ArrayList<>();
if (num.length == 0 || size == 0 || size > num.length){
return ans;
}
// int index = 0;
int Max = Integer.MIN_VALUE;
int pos = -1;
for (int i = 0; i < size ; i++){
if (num[i] > Max){
Max = num[i];
pos = i;
}
}
ans.add(Max);
for (int i = size;i<= num.length - 1; i++){//i-->窗口的右区间
if (i - size + 1 <= pos ){
if (num[i] >Max){
Max = num[i];
pos = i;
}
}else {
Max = Integer.MIN_VALUE;
for (int j = i - size + 1; j <=i;j++){
if (num[j] > Max){
Max = num[j];
pos = j;
}
}
}
ans.add(Max);
}
return ans;
}
}
题目二
import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;
/**
* @desc 队列最大值
* @author zhaoliang
* @date 20200420
*/
public class Main59_ {
//请定义一个队列并实现函数 max_value 得到队列里的最大值,
// 要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。
//若队列为空,pop_front 和 max_value 需要返回 -1
Queue<Integer> queue;//主队列
Deque<Integer> deque;//辅助队列
public void MaxQueue() {
queue = new LinkedList<>();
deque = new LinkedList<>();
}
public int max_value() {
if (deque.isEmpty())
return -1;
return deque.peek();//getFirst();
}
public void push_back(int value) {
//主队列正常加入
queue.add(value);
// 辅助队列清除尾部比当前值更小的元素
while (!deque.isEmpty() && deque.getLast() < value){
deque.removeLast();
}
deque.add(value);
}
public int pop_front() {
if (queue.isEmpty())
return -1;
int res = queue.poll();//res 是主队列出队的值和辅助队列
if (res == deque.peek()){
deque.poll();
}
return res;
}
}