栈和队列题

来源:互联网 发布:网络社交 编辑:程序博客网 时间:2024/06/08 19:01

1.生成窗口最大值。
这里写图片描述
两种方法:

//第一种:两个for循环,时间复杂度o(N*W)    public static  LinkedList<Integer> getMaxWindow2(int[] arr,int w){        if(arr==null||w<1||arr.length<w){            return  null;        }        LinkedList<Integer> list = new LinkedList<>();        int max=Integer.MIN_VALUE;        for(int i=0;i<arr.length-w+1;i++){            for(int j=i;j<i+w&&j<arr.length;j++){                if(arr[j]>max){                    max=arr[j];                }            }            list.add(max);            max=Integer.MIN_VALUE;        }        return  list;    }  //第二种,时间复杂度O(N)     /**     * 生成窗口最大值数组     * 1.定义队列。2.遍历数组放于队尾,如果对尾元素小于将要放入的元素,进行出对操作。     * 3.如果对尾的下标超过界限,将移除队头元素。4.将对首元素放于列表中。     */    public static  LinkedList<Integer> getMaxWindow(int[] arr,int w){        if(arr==null||w<1||arr.length<w){            return  null;        }        LinkedList<Integer> qmax= new LinkedList<>();        LinkedList<Integer> list = new LinkedList<>();        int index=0;        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){               list.add(arr[qmax.peekFirst()]);            }        }        return  list;    } 

2.最大子矩阵的大小,例如:矩阵的高为3,2,3。最大子矩阵面经为2*3。

    /**     * 求最大子矩阵的大小,时间复杂度为o(M*N)     * 1.通过栈进行计算:从左到右遍历数组,每遍历一个位置,把位置放入栈中。栈中数据是由大到小排列,表示矩形可以向左边扩展。     */    public static int maxRecSize(int[] height){        if(height==null||height.length==0){            return  0;        }        int maxArea=0;        Stack<Integer> stack = new Stack<>();        for(int i=0;i<height.length;i++){            while (!stack.isEmpty()&&height[i]<=height[stack.peek()]){                int j=stack.pop();                int k=stack.isEmpty()?-1:stack.peek();                int cur=(i-k-1)*height[j];                maxArea=Math.max(maxArea,cur);            }            stack.push(i);        }        while (!stack.isEmpty()){            int j=stack.pop();            int k=stack.isEmpty()?-1:stack.peek();            int cur=(height.length-k-1)*height[j];            maxArea=Math.max(maxArea,cur);        }        return  maxArea;    }
原创粉丝点击