zoukankan      html  css  js  c++  java
  • LeetCode

    题目:

    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].


    The largest rectangle is shown in the shaded area, which has area = 10 unit.

    For example,
    Given height = [2,1,5,6,2,3],
    return 10.

    思路:

    1)对每个直方维护它能拓展到左右两边最远的边界。

    package area;
    
    public class LargestRectangleInHistogram {
    
        public int largestRectangleArea(int[] height) {
            int n = height.length;
            int max = 0;
            int[] left = new int[n];
            int[] right = new int[n];
            for (int pos = 0; pos < n; ++pos) {
                left[pos] = right[pos] = pos;
                int i = pos - 1;
                for (; i >= 0; --i) {
                    if (height[i] < height[pos]) {
                        left[pos] = i + 1;
                        break;
                    }
                }
                if (i == -1) left[pos] = 0;
                
                for (i = pos + 1; i < n; ++i) {
                    if (height[i] < height[pos]) {
                        right[pos] = i - 1;
                        break;
                    }
                }
                if (i == n) right[pos] = n - 1;
                int area = height[pos] * (right[pos] - left[pos] + 1);
                if (area > max)
                    max = area;
            }
    
            return max;
        }
        
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            int[] height = { 1,1,1,1 };
            LargestRectangleInHistogram l = new LargestRectangleInHistogram();
            System.out.println(l.largestRectangleArea(height));
        }
    
    }

    2)维护一个栈,对比当前元素,如果大于当前元素,则pop,否则push当前元素的index

    package area;
    
    import java.util.Stack;
    
    public class LargestRectangleInHistogram {
    
        public int largestRectangleArea(int[] height) {
            Stack<Integer> stack = new Stack<Integer>();
            int max = 0;
            int n = height.length;
            int[] newHeight = new int[n + 1];
            for (int i = 0; i < n; ++i) newHeight[i] = height[i];
            newHeight[n] = 0;
            int i = 0;
            while (i < n + 1) {
                if (stack.isEmpty() || newHeight[stack.peek()] <= newHeight[i]) {
                    stack.push(i++);
                } else {
                    int index = stack.pop();
                    int area = (stack.isEmpty() ? i : (i - stack.peek() - 1)) * newHeight[index];
                    max = (max < area ? area : max);
                }
            }
            
            return max;
        }
        
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            int[] height = { 1,1 };
            LargestRectangleInHistogram l = new LargestRectangleInHistogram();
            System.out.println(l.largestRectangleArea(height));
        }
    
    }
  • 相关阅读:
    java类的继承
    Java数组运算
    Eclipse问题提示
    oracle的insert的时候&符号如何插入(转义)
    修改数据库用户名--CMD环境执行有效
    java环境变量设置
    当前时间时间戳以及10分钟后的时间戳
    复选框事件
    分享到
    多物体运动
  • 原文地址:https://www.cnblogs.com/null00/p/5096633.html
Copyright © 2011-2022 走看看