精华内容
下载资源
问答
  • 最大矩形

    2019-09-04 10:49:22
    ###最大矩形 ####原题 在一个位图中找面积最大的白色矩形:给你一个NxN的黑白位图,找一个面积最大的全白色的矩形。注意了,是一个矩形,不是任意一个白色相连的区域。你的算法能够达到的最好的时间复杂度是多少呢?...

    ###最大矩形

    ####原题
    在一个位图中找面积最大的白色矩形:给你一个NxN的黑白位图,找一个面积最大的全白色的矩形。注意了,是一个矩形,不是任意一个白色相连的区域。你的算法能够达到的最好的时间复杂度是多少呢?

    ####分析
    为了方便进行分析,我们假设黑色位置都是0,白色的位置都是1.题目的问题就转化为,找到一个最大的矩形,其中所有的元素都是1.

    遇到这样的题目,该如何分析呢?这是一个矩形,是二维,是否是由一维的某些问题扩展而来的呢?一维的问题的解法,是否可以扩展到二维呢?我们看下面的题目:

    在柱状图中找最大的矩形:给一组非负的整数来表示一个柱状图,设计一个算法找到最大面积的能适合到柱状图内的矩形。比如,对与这组数,1 2 3 4 1 ,有两种可能的方案,一种是适合到 2 3 4 内的矩形,面积是 23;另一种是适合到 3 4 内的矩形,面积是 32。你觉得能有O(n)算法吗?

    一维的时候思路如下:

    一个线性算法是用堆栈来保存当前可能的矩形(高度和起始位置)。从左到右扫描,对一个元素,如果 a)大于栈顶元素, push; b)小于的话,pop所有的大于它的元素,计算面积,更新最大值。这时如果堆栈空,push一个新的元素,高度等于当前元素,起始位置为0;否则,push当前元素高度和栈顶的起始位置。

    这是一个很巧妙的解法,是否能够应用到二维的情况呢?针对如下例子,有矩阵A:

    110010
    011111
    111110
    001100

    上面的这个矩阵,该如何转化为一维的情况处理呢?最直接的思路如下:

    • 第一行作为一维的情况处理;
    • 第一行、第二行,对应列相加,生成一个新的数组,然后应用一维的处理情况;
    • 第一行、第二行、第三行,对应列相加,生成一个新的数组,然后应用一维的处理情况;
    • …直到整个矩阵都包括在内;
    • 第二行作为一维的情况处理;
    • 第二行、第三行,对应列相加,生成一个新的数组,然后应用一维的处理情况;
    • …一次类推

    上面的思路是可行的,但是时间复杂度是n^3的。如何进一步改进呢?思路也是从上面的过程中得到的。

    生成新的矩阵C,C[i][j]表示第j列,从第i个元素开始,包括第i个元素,向上数,直到遇到0时,1的个数。则C为:

    110010
    021121
    132230
    003300

    上面这个矩阵的构造,遍历一边A的全部元素即可。n^2的时间复杂度。这个矩阵的最大作用,就是将上面思路中,跨几行考虑的情况,都变为一行了。时间复杂度降了一个级别,每一行,应用一维处理处理的情况,就可以得到最终的结果。

    将上面斜体的描述转换为如下步骤:(h, i),h表示C[i][j]的大小,可以理解为矩形的高度,i表示起始位置,第三行为例:

    iC[i]栈操作最大值栈内容
    01push (1,0)(1,0)
    13push (3,1)(3,1)(1,0)
    22pop (3,1),push (2,1)(2-1)*3=3(2,1)(1,0)
    32什么都不做(2,1)(1,0)
    43push(3,4)(3,4)(2,1)(1,0)
    50pop(3,4)(5-4)*3=3(2,1)(1,0)
    50pop(2,1)(5-1)*2=8(1,0)
    50pop(1,0)(5-0)*1=5

    则得到这一行的最大值为8。

    总结算法过程如下:

    • 初始(h,0),入栈;
    • 遍历后续元素:
      • 如果h > h_top, 则入栈;
      • 如果h = h_top, 则不进行任何操作;
      • 如果h < h_top, 出栈,直到栈顶元素的高度小于h,每次出栈,更新最大值(i - i_pop)*h_pop > max ? (i - i_pop)*h_pop : max;此时如果h>h_top,则push (h, i_lastpop),如果栈为空,则push (h, 0).
    • 直到元素遍历完毕
    展开全文
  • 01矩阵最大正方形面积 题意:给定一个矩阵,其中的元素为0或者1,要求找出其中元素全为1的面积最大的正方形。 题解:动态规划:对每个元素,把以其为右下角,元素全为1的正方形的最长边长记录...01矩阵最大矩形面积 ...

    01矩阵最大正方形面积
    题意:给定一个矩阵,其中的元素为0或者1,要求找出其中元素全为1的面积最大的正方形。
    题解:动态规划:对每个元素,把以其为右下角,元素全为1的正方形的最长边长记录下来。如果以元素a(i, j)为右下角的正方形边长为b,那么以a(i-1, j)为右下角的正方形边长肯定为b-1,且以a(i, j-1)为右下角的正方形边长为b-1,否则正方形的边不完整。
    在这里插入图片描述
    01矩阵最大矩形面积
    转换成每行的直方图最大矩形面积
    在这里插入图片描述
    在这里插入图片描述
    直方图最大矩形面积
    题解:

    1. 创建一个空栈
    2. 从第一个矩形条开始,对每个矩形条的高度height[i] (i的取值范围是[0,n-1])执行下面两步
      a) 如果栈为空,或height[i]大于等于栈顶元素,那么将矩形条i压入栈中。
      b) 如果输入的矩形条高度小于栈顶元素高度,那么将栈顶元素在输入数组中的索引tp出栈,然后计算矩形面积。矩形的高为height[tp],而右边界为i,左边界为当前栈顶元素对应的索引,若栈为空,则宽度就是i。
    3. 经过计算后,栈非空,然后将栈中元素逐个弹出,并按照步骤2计算矩形面积,并且更新最大值。
      参考:https://blog.csdn.net/Revivedsun/article/details/52420679
      在这里插入图片描述
    import java.util.Stack;
    
    public class demo6 {
    	
    	public static void main(String args[]){
            int[][] arr={{1 ,0, 1, 0 ,0},{1 ,1 ,1 ,1 ,1},{1, 1, 1 ,1, 1},{1 ,0 ,0 ,1 ,0}};
            //求01矩阵最大正方形面积
            int maxSquareSize = findMaxSquareSize(arr);
            System.out.println(maxSquareSize);
            //求01矩阵最大矩形面积
            int maxRectangleSize = findMaxRectangleSize(arr);
            System.out.println(maxRectangleSize);
            
        }
    
    	
    	/** 给定一个矩阵,其中的元素为0或者1,要求找出其中元素全为1的面积最大的正方形。
    	 * 动态规划:对每个元素,把以其为右下角,元素全为1的正方形的最长边长记录下来。如果以元素a(i, j)为右下角的正方形边长为b,
    	 * 那么以a(i-1, j)为右下角的正方形边长肯定为b-1,且以a(i, j-1)为右下角的正方形边长为b-1,否则正方形的边不完整。
    	 * dp[i][j] = Math.min(dp[i-1][j-1], Math.min(dp[i-1][j], dp[i][j-1]))+1;
    	 * @param arr
    	 * @return
    	 */
    	private static int findMaxSquareSize(int[][] arr) {
    		if(arr==null||arr.length==0) return 0;
    		int rows = arr.length;
    		int cols = arr[0].length;
    		int len = 0;
    		int[][] dp = new int[rows+1][cols+1];
    		for(int i=1;i<=rows;i++) {
    			for(int j=1;j<=cols;j++) {
    				if(arr[i-1][j-1]==1) {
    					dp[i][j] = Math.min(dp[i-1][j-1], Math.min(dp[i-1][j], dp[i][j-1]))+1;
    					len = Math.max(dp[i][j],len);
    				}
    			}
    		}
    		return len*len;
    	}
    	
    	
    	/**在一个M * N的矩阵中,所有的元素只有0和1, 找出只包含1的最大矩形。
    	 * 转换成每一行的直方图最大矩阵面积
    	 * @param matrix
    	 * @return
    	 */
    	public static int findMaxRectangleSize(int[][] matrix) {
    		if (matrix.length == 0)
    			return 0;
    		int[] heights = new int[matrix[0].length];
    		int max = 0;
     
    		for (int i = 0; i < matrix.length; i++) {
    			for (int j = 0; j < matrix[0].length; j++) {
    				if (matrix[i][j] == 1)
    					heights[j] += 1;
    				else
    					heights[j] = 0;
    			}
     
    			max = Math.max(max, findMaxRectangleSizeSingleRows(heights));
    		}
     
    		return max;
     
    	}
    	
    	/**一个直方图是由许多矩形组成,在给定的直方图中找出最大的矩形面积。
    	 * 1.创建一个空栈
    	 * 2.从第一个矩形条开始,对每个矩形条的高度height[i] (i的取值范围是[0,n-1])执行下面两步 
    	 * a) 如果栈为空,或height[i]大于等于栈顶元素,那么将矩形条i压入栈中。 
    	 * b)如果输入的矩形条高度小于栈顶元素高度,那么将栈顶元素在输入数组中的索引tp出栈,然后计算矩形面积。
    	 * 矩形的高为height[tp],而右边界为i,左边界为当前栈顶元素对应的索引,若栈为空,则宽度就是i。
    	 * 3.经过计算后,栈非空,然后将栈中元素逐个弹出,并按照步骤2计算矩形面积,并且更新最大值。
    	 * @param arr
    	 * @return
    	 */
    	public static int findMaxRectangleSizeSingleRows(int[] arr) {
    		if(arr==null||arr.length==0) return 0;
    		Stack<Integer> stack = new Stack<>();
    		int maxSize = 0;
    		int curSize = 0;
    		int curHeight = 0;
    		int n = arr.length;
    		int i = 0;
    		while(i<n) {
    			if(stack.empty()||arr[stack.peek()]<=arr[i]) {
    				stack.push(i++);
    			}else {
    				
    				curHeight = arr[stack.pop()];
    				curSize = curHeight*(stack.empty()?i:i-stack.peek()-1);
    				maxSize = Math.max(maxSize, curSize);
    			}
    		}
    		while(!stack.empty()) {
    			curHeight = arr[stack.pop()];
    			curSize = curHeight*(stack.empty()?i:i-stack.peek()-1);
    			maxSize = Math.max(maxSize, curSize);
    		}
    		
    		return maxSize;
    	}
        
    }
    
    
    展开全文
  • Leetcode 最大矩形

    千次阅读 2021-02-21 19:17:50
    最大矩形 题目描述: 给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。 提示:    rows == matrix.length    cols == ...

    最大矩形

    题目描述:

    给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
    提示:
       rows == matrix.length
       cols == matrix[0].length
       0 <= row, cols <= 200
       matrix[i][j] 为 '0' 或 '1'

    题目链接

    示例

    在这里插入图片描述

    输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]
    输出:6
    解释:最大矩形如上图所示。
    class Solution {
        public int maximalRectangle(char[][] matrix) {
            int row = matrix.length;
            if(row == 0) return 0;
            int col = matrix[0].length;
            // 初始化
            int[][] heights = new int[row][col];
            for(int i = 0 ; i<col ; i++){
                for(int j = row-1 ; j>=0 ; j--){
                    if(matrix[j][i] == '1'){
                        heights[j][i] = ((j == row-1)?0:(heights[j+1][i]))+1;
                    }
                }
            }
            int max = 0;
            for(int i = 0 ; i<row ; i++){ // 遍历每一行
                int temp = largestRectangleArea(heights[i]);
                max = (max>temp)?max:temp;
            }
            return max;
        }
        private int largestRectangleArea(int[] heights) {
            int len = heights.length;
            if(len == 0) return 0;
            if (len == 1) return heights[0];
    
            int result = 0;
            Stack<Integer> stack = new Stack<>();
            for (int i = 0; i < len; i++) {
                while (!stack.empty() && heights[i] < heights[stack.peek()]) { // 如果当前遍历下标的高度严格小于下标为栈顶的元素高度
                    int curHeight = heights[stack.pop()];
                    while (!stack.empty() && heights[stack.peek()] == curHeight) { // 相等情况下去重
                        stack.pop();
                    }
    
                    int curWidth;
                    if (stack.empty()) {
                        curWidth = i;
                    } else {
                        curWidth = i - stack.peek() - 1;
                    }
                    result = Math.max(result, curHeight * curWidth);
                }
                stack.push(i);
            }
            // 最终处理
            while (!stack.empty()) {
                int curHeight = heights[stack.pop()];
                while (!stack.empty() && heights[stack.peek()] == curHeight) {
                    stack.pop();
                }
                int curWidth;
                if (stack.empty()) {
                    curWidth = len;
                } else {
                    curWidth = len - stack.peek() - 1;
                }
                result = Math.max(result, curHeight * curWidth);
            }
            return result;
        }
    }
    

    该题本质上就是单调栈的应用,读者可以首先理解完该题,再来解决此题。
    首先我们需要进行预处理,即对matrix矩阵每一列的连续1的个数记录到heights矩阵中,最后以一行一行的顺序进行单调栈操作,通过每一行的最大的矩形面积更新全局最大矩形面积。读者可以试着在草稿纸上模拟,详细请看代码。

    展开全文
  • 将网上计算多边形内最大矩形的java源码翻译成为c++/qt源.
  • 9715 相邻最大矩形面积
  • Java实现 LeetCode 85 最大矩形

    万次阅读 多人点赞 2020-02-16 22:46:14
    85. 最大矩形 给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。 示例: 输入: [ [“1”,“0”,“1”,“0”,“0”], [“1”,“0”,“1”,“1”,“1”], [“1”,“1”,“1”,“1”,...

    85. 最大矩形

    给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。

    示例:

    输入:
    [
    [“1”,“0”,“1”,“0”,“0”],
    [“1”,“0”,“1”,“1”,“1”],
    [“1”,“1”,“1”,“1”,“1”],
    [“1”,“0”,“0”,“1”,“0”]
    ]
    输出: 6

    PS:
    使用单调栈方法求解(同84)

    class Solution {
          public int maximalRectangle(char[][] matrix) {
            if (matrix == null || matrix.length == 0 || matrix[0].length == 0) return 0;
            int[] height = new int[matrix[0].length];
            int globalmax = 0;
            for (int i = 0; i < matrix.length; i++){
                for (int j = 0; j < matrix[0].length; j++){
                    if (matrix[i][j] == '0') height[j] = 0;
                    else height[j]++;
                }
                globalmax = Math.max(globalmax, maxrow(height));
            }
            return globalmax;
        }
        public int maxrow(int[] height){
            Stack<Integer> st = new Stack<>();
            int localmax = 0;
            for (int i = 0; i <= height.length; i++){
                int h = (i == height.length)? 0 : height[i];
                while (!st.isEmpty() && height[st.peek()] >= h){
                    int maxheight = height[st.pop()];
                    int area = st.isEmpty()? i * maxheight : maxheight * (i - st.peek() -1);
                    localmax = Math.max(localmax, area);
                }
                st.push(i);
            }
            return localmax;
        }
    }
    
    展开全文
  • 最大矩形面积

    2018-06-05 19:28:59
    最大矩形面积-牛客网 给定一组非负整数组成的数组h,代表一组柱状图的高度,其中每个柱子的宽度都为1。 在这组柱状图中找到能组成的最大矩形的面积(如图所示)。 入参h为一个整型数组,代表每个柱子的高度,返回...
  • LeetCode 85 最大矩形

    千次阅读 2021-01-24 17:31:44
    LeetCode 85 最大矩形 题目链接 给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。 示例 1: 输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"]...
  • 【LeetCode】柱状图中最大的矩形、最大矩形 柱状图中最大的矩形★★★ LeetCode84. 柱状图中最大的矩形 【题目】给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图...
  • 计算多边形内最大矩形的c++代码,只有一个头文件,要用到OpenCV+STL,有例程,根据网上代码(QT版C++代码)修改而成,修改内容包括: 1. 把QT的东西用OpenCV和STL替换 2. 去掉了部分bug 3. 注释掉了部分代码 4. ...
  • LeetCode 最大矩形

    千次阅读 2019-02-16 18:25:22
    给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。 示例: 输入: [ ["1","0","1","0","0"], ["1","0",&...
  • CCF 最大矩形

    2016-08-16 18:11:11
    一.问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ n)个矩形...对于上面给出的例子,最大矩形如下图所示的阴影部分,面积是10。输入格式  第一行包含一个整数n,即矩形的数量(1 ≤ n ≤
  • 直方图最大矩形

    千次阅读 2016-09-10 22:04:00
    问题 ...对应的最大矩形面积为10. 枚举 对每个左边界,可以枚举其右边界的位置,寻找面积最大值。 int h[] = [2,1,5,6,2,3]; int length = 6, max = 0, s = 0; for(int i = 0; i ; i ++) {
  • ccf 最大矩形

    2015-12-17 20:43:09
    问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ n)个矩形的高度是hi。这n个矩形构成了一个...对于上面给出的例子,最大矩形如下图所示的阴影部分,面积是10。 输入
  • 最大矩形(单调栈)1. 题目描述2. 题目分析3. C语言实现 1. 题目描述 难度:困难 2. 题目分析 这道题目似曾相识啊,最大矩形面积的问题我们在LeetCode84.柱状图中最大的矩形也遇到过类似的问题,在84题中,我们应用...
  • 力扣最大面积最大矩形 给定一个由 0 和 1 填充的二维二进制矩阵,找到仅包含 1 的最大矩形并返回其面积。 Example: Input: [ ["1","0","1","0","0"], ["1","0","1","1","1"], ["1","1","1","1","1"], ["1","0","0",...
  • 求直方图围成的最大矩形面积 有一个直方图,用一个整数数组表示,其中每列的宽度为1,求所给直方图包含的最大矩形面积。比如,对于直方图[2,7,9,4],它所包含的最大矩形的面积为14(即[7,9]包涵的7x2的矩形)。 给定一...
  • 题目描述有一个直方图,用一个整数数组表示,其中每列的宽度为1,求所给直方图包含的最大矩形面积。比如,对于直方图[2,7,9,4],它所包含的最大矩形的面积为14(即[7,9]包涵的7x2的矩形)。 给定一个直方图A及它的总...
  • LeetCode:85. 最大矩形

    千次阅读 2019-02-14 09:37:48
    给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
  • 85. 最大矩形

    2018-08-21 22:00:01
    85. 最大矩形 转载自这里写链接内容 给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。 示例: 输入: [ ["1","0","1","0","0&...
  • 相邻最大矩形面积

    2017-11-01 22:38:58
    相邻最大矩形面积 时间限制:1000MS 内存限制:65535K 提交次数:0 通过次数:0 题型: 编程题 语言: G++;GCC;VC Description 在X轴上水平放置着 N 个条形图,这 N 个条形图就组成了一个柱状图,...
  • 今天小编就为大家分享一篇关于利用枚举法求直方图中最大矩形面积的方法实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • 1.柱状图中最大的矩形 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。...图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。   示例: 输入: [2,1,5,6,2,3] 输出: 1...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 111,323
精华内容 44,529
关键字:

最大的矩形