码迷,mamicode.com
首页 > 其他好文 > 详细

Largest Rectangle in Histogram

时间:2015-08-02 11:38:09      阅读:96      评论:0      收藏:0      [点我收藏+]

标签:

问题描述

 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)栈内存储的是数组遍历过程中的非递减元素的下标;

(2)如果遍历的当前元素比栈顶元素更小,则弹出栈顶值(下标)的索引元素,作为高度;宽度要看栈是否为空,如果为空则直接为下标值,否则为当前遍历的下标减去栈顶值再减1;

(3)遍历结束,如果栈内还有元素,则继续计算。

时间/空间复杂度均为O(n).

 

程序

public class Solution {
    public int largestRectangleArea(int[] height) {
        if (height == null || height.length == 0) {
            return 0;
        }
        
        Stack<Integer> s = new Stack<>();
        int max = 0;
        
        for (int i = 0; i <= height.length; i++) {
            int cur = i == height.length ? -1 : height[i]; // trick
            while (!s.isEmpty() && cur < height[s.peek()]) {
                int h = height[s.pop()];
                int w = s.isEmpty() ? i : i - s.peek() - 1;
                max = Math.max(max, h * w);
            }
            s.push(i);
        }
        
        return max;
    }
}

 

Follow up

Maximal Rectangle

问题描述

Given a 2D binary matrix filled with 0‘s and 1‘s, find the largest rectangle containing all ones and return its area.

 

解决思路

假设矩阵的行数为n, 列数为m.

首先将矩阵转化为n个rectangle,然后利用上面的方法计算max,最后输出这n个中的max即可。

 

程序

public class Solution {
    public int maximalRectangle(char[][] matrix) {
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return 0;
        }
        
        int[][] nums = transform(matrix);
        int max = 0;
        
        for (int i = 0; i < matrix.length; i++) {
            max = Math.max(max, getMaxRectangle(nums[i]));
        }
        
        return max;
    }
    
    private int getMaxRectangle(int[] nums) {
        if (nums == null || nums.length == 0) {
            return 0;
        }
        
        Stack<Integer> s = new Stack<>();
        int max = 0;
        
        for (int i = 0; i <= nums.length; i++) {
            int cur = i == nums.length ? -1 : nums[i];
            while (!s.isEmpty() && cur < nums[s.peek()]) {
                int h = nums[s.pop()];
                int w = s.isEmpty() ? i : i - s.peek() - 1;
                max = Math.max(max, h * w);
            }
            s.push(i);
        }
        
        return max;
    }
    
    // transform to single rectangle
    private int[][] transform(char[][] matrix) {
        int n = matrix.length, m = matrix[0].length;
        int[][] nums = new int[n][m];
        // first row
        for (int j = 0; j < m; j++) {
            nums[0][j] = matrix[0][j] - ‘0‘;
        }
        //other
        for (int i = 1; i < n; i++) {
            for (int j = 0; j < m; j++) {
                nums[i][j] = matrix[i][j] == ‘0‘ ? 0 : nums[i - 1][j] + 1;
            }
        }
        return nums;
    }
}

  

Largest Rectangle in Histogram

标签:

原文地址:http://www.cnblogs.com/harrygogo/p/4695190.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!