• 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;
        }
    }
  • 相关阅读:
    四、分配swap分区
    三、fdisk分区
    二、文件系统常用命令
    一、回顾分区和文件系统
    三、文件系统属性chattr权限&系统命令sudo权限
    2、开发环境搭建
    1、基本概念
    SSH服务
    CentOS 7安装启动vsftpd服务
    01.HTML 5与HTML4的区别
  • 原文地址:https://www.cnblogs.com/qionglouyuyu/p/10938902.html
Copyright © 2020-2023  润新知