题目:
输入:整型数组arr,长度为n,窗口大小为w。(顺序移窗,则一共产生n-w+1个窗)
输出:一个长度为n-w+1的数组rst,rst[i]表示每种窗口状态下的最大值。如
int[] arr = {4,3,5,4,6,3,3,6,7},数组长为7,窗口w=3,则int[] rst = {5,5,5,6,4,7}
实现:利用(双端)队列qmax实现窗口最大值的更新,双端队列qmax中存放数组arr的下标。每个下标最多进一次,出一次,所有遍历过程中进出队列的时间复杂度为O(N),整体时间复杂度也为O(N)。
- 开始时,qmax={}.
- 遍历到arr[0]=4,将下标0放入qmax,qmax={0}。
- 遍历到arr[1]=3,队尾下标为0,而arr[0]>arr[1],将下标1放入qmax,qmax={0,1}。
- 遍历到arr[2]=5,队尾下标为1,而arr[1]<arr[2](有比队尾大的元素,则删除队尾元素,直到5<队尾元素),因此将下标2弹出,qmax={0}。队尾下标为0,而arr[0]<arr[2],因此将下标0弹出,qmax={}。将arr[2]写入,qmax={2}。
- 此时已经遍历到窗口arr[0…2]出现,当前qmax队头下标为2,所以窗口arr[0…2]的最大值为arr[2]。
- 遍历到arr[3],当前队尾下标为2,arr[2]>arr[3],因此将3压入,qmax={2,3},
此时窗口[1,…3]出现,当前队头下标为2,所以窗口arr[1,…3]的最大值为arr[2]。
1 | import java.util.LinkedList; |
1 | //Test |