zoukankan      html  css  js  c++  java
  • 84. Largest Rectangle in Histogram (JAVA)

    Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.


    Above is a histogram where width of each bar is 1, given height =[2,1,5,6,2,3].

     

    思路:用动态规划。

    法I:首先想到用两个数组,分别存储向左最大延伸位置以及向右最大延伸位置,这种方法要遍历两边,且空间复杂度O(n)+O(n)

    法II:用stack的栈顶元素指示所要计算的height,左界是栈顶第二个元素+1位置(因为只有栈顶永远是栈中高度最高的元素),右界是当前元素-1位置(当前元素比栈顶元素低的情况下)。当当前元素高度>= 栈顶元素高度,入栈,i++;当当前元素高度<栈顶元素高度,出栈,计算当前面积,i不增加。

    class Solution {
        public int largestRectangleArea(int[] heights) {
            Stack<Integer> st = new Stack<Integer>(); 
            if(heights.length == 0) return 0;
            
            int leftIndex;
            int topIndex;
            int area;
            int maxArea = 0; 
            int i = 0;
            while(i < heights.length){
                if(st.empty() || heights[i] >= heights[st.peek()]){
                    st.push(i);
                    i++;
                }
                else{
                    topIndex = st.peek();
                    st.pop();
                    leftIndex = st.empty()?0:st.peek()+1; //如果是空,说明从头开始的所有高度都比heights[topIndex]高
                    area = ((i-1)-leftIndex + 1) * heights[topIndex];
                    if(area > maxArea) maxArea = area;
                }
            }
            while(!st.empty()){ //没有比栈顶元素小的元素让它出栈
                topIndex = st.peek();
                st.pop();
                leftIndex = st.empty()?0:st.peek()+1; 
                area = ((i-1)-leftIndex + 1) * heights[topIndex];
                if(area > maxArea) maxArea = area;
            }
            return maxArea;
        }
    }
  • 相关阅读:
    通信中几种复用方式的介绍
    通信的一些基本概念整理
    网易有道2017内推选择题
    腾讯2017暑期实习生编程题
    MATLAB的一些应用--最近用的比较多
    (十六)命令模式-代码实现
    (十四)观察者模式-代码实现
    (十三)备忘录模式-代码实现
    (十二)模板模式-代码实现
    (十一)享元模式-代码实现
  • 原文地址:https://www.cnblogs.com/qionglouyuyu/p/10938902.html
Copyright © 2011-2022 走看看