程序员代码面试指南--生成窗口最大值数组
2018-02-10 16:10
597 查看
/** 生成窗口最大值数组 【题目】 有一个整城数组arr和一个大小为w的窗口从数组的最左边滑到最右边,容口每次向右边滑一个位置。 如果数组长度为n,窗口大小为w,则一共产生n-w+1个窗口的最大值。 请实现一个函数。 -输入:整型数组arr,窗口大小为w。 -输出:一个长度为n-w+1的数组res,res[]表示每一种窗口状态下的最大值。 */ /** 假设遍历到arr[i],qmax的放入规则为: 1.如果qmax为空,直接把下标i敞进qmax,放入过程结束。 2.如果qmax不为空,取出当前qmax队尾存放的下标,假设为j 1)如果arr[j]>arr[i],直接把下标故进qmax的队尾,放入过程结束。 2)如果arr[j]<=arr[i],把j从qmax中弹出,继续qmax的放入规则。 假设遍历到arr[i],qmax的弹出规则为: 如果qmax队头的下标等于i-w,说明当前qmax队头的下标已过期,弹出当前队头的下标即可. 根据如上的放入和弹出规则,qmax便成了一个维护窗口为w的子数组的最大值更新的结构。 */ import java.util.LinkedList; public class C07_SlidingWindowMaxArray { public static void main(String[] args) { int[] arr = new int[]{4,3,5,4,3,3,6,7}; int w = 3; printArr(getMaxWindow(arr, w)); } public static int[] getMaxWindow(int[]arr,int w){ //防护 if(arr==null || w<1 || arr.length< w){ return null; } int[]res = new int[arr.length-w+1]; int index = 0;//当前位置的指针 LinkedList<Integer>qmax = new LinkedList<Integer>();//存放下标 for (int i = 0; i < arr.length; i++) { while(!qmax.isEmpty() && arr[qmax.peekLast()]<=arr[i]){ qmax.pollLast(); } qmax.addLast(i); if(qmax.peekFirst()==i-w){//队头已经不再窗口范围了,将其弹出 qmax.pollFirst(); } if(i>=w-1){//必须是当前窗口大小大于指定窗口大小w的时候才将最大值加进数组res res[index++] = arr[qmax.peekFirst()]; } } return res; } public static void printArr(int[]arr){ for (int i : arr) { System.out.print(i+" "); } System.out.println(); } }
相关文章推荐
- 程序员面试指南之生成窗口数值最大数组
- 程序员代码面试指南--由两个栈组成的队列
- 生成窗口最大值数组
- 程序员代码面试指南(栈和队列)
- 生成窗口最大值数组
- 栈和队列---生成窗口最大值数组
- 程序员代码面试指南-猫狗队列(c++)
- 生成窗口最大值数组
- 【程序员代码面试指南 编程笔记】猫狗队列(C++解法)
- 程序员代码面试指南:IT名企算法与数据结构题目最优解
- 算法:生成窗口最大值数组
- 生成窗口最大值数组 + 双端队列
- 生成窗口最大值数组(java实现)
- 栈和队列——生成窗口最大值数组
- 【程序员代码面试指南】-栈和队列-最小栈/ 双栈队列/ 栈排序
- 设计一个有getMin功能的栈 程序员代码面试指南
- 程序员代码面试指南--如何仅用递归函数和栈操作逆序一个栈
- 生成窗口最大值数组
- 数据结构 生成窗口最大值数组
- 程序员代码面试指南--设计一个具有getMin功能的栈