生成窗口最大值数组

来源:互联网 发布:天猫淘宝京东的区别ppt 编辑:程序博客网 时间:2024/06/09 14:52

有一个整型数组arr和一个大小为w的窗口从数组的左边移动到右边,窗口每次向右边移动一个位置。

例如:整型数组arr为4, 3, 5, 4, 3, 3, 6, 7,窗口大小为3,返回结果为5,5,5,4,6,7


import java.util.LinkedList;public class GetMaxWindow {public static void main(String[] args) {int[] a = { 4, 3, 5, 4, 3, 3, 6, 7 };int[] solution = solution(a, 3);System.out.print("最大值数组为:");for (int i = 0; i < solution.length; i++) {System.out.print(solution[i] + " ");}}public static int[] solution(int[] arr, int w) {if (arr == null || w < 1 || arr.length < w) {return null;}LinkedList qMax = new LinkedList();// 定义一个双端队列,保持的时数组下标int[] res = new int[arr.length - w + 1];// 最大值数组元素的个数int index = 0;for (int i = 0; i < arr.length; i++) {int cur = arr[i];while (!qMax.isEmpty() && arr[qMax.peekLast()] <= cur) {// 当双端队列不空,并且当前元素大于等于队列的尾的元素时qMax.pollLast();// 把队列尾部元素弹出}qMax.addLast(i);// 把当前数组下标存到队列中if (qMax.peekFirst() == i - w) {// 当队首的元素下标为i-w时,过期qMax.pollFirst();// 将队首元素弹出}if (i >= w - 1) {// 如i=3,w=3,此时窗口下标应为[1,2,3],index为0,故此时index加1,即窗口右移res[index++] = arr[qMax.peekFirst()];// 当前窗口的最大值,即窗口右移一位后的首部}}return res;}}

原创粉丝点击