【LeetCode 85】最大矩形(第二遍)

题目链接

【题解】

首先 我们处理出来一个数组 a[i][j].
这个数组的含义是,矩阵中(i,j)包括自身往上有多少个连续的1.
然后我们枚举行i.
表示我们现在要考察的矩阵的下边在第i行。
然后我们再处理出来一个一维数组heights[j]
其中heights[j] = a[i][j]
然后,问题就转化为在一个柱状图里面求一个最大的矩形了。用这个方法
做就行了。
枚举行O(N)的复杂度,柱状图求最大的矩阵也是O(N)的复杂度
因此这道题的时间复杂度为O(N^2)

【代码】

class Solution {
public:
    int maximalRectangle(vector<vector<char>>& matrix) {
        int n = matrix.size();
        int m = 0;
        if (!matrix.empty()) m = matrix[0].size();
        int a[500+10][500+10];
        for (int i = 0;i< n;i++){
            for (int j = 0;j < m;j++){
                if (i-1>=0 && matrix[i-1][j]=='1' && matrix[i][j]=='1'){
                    a[i][j] = a[i-1][j]+1;
                }else a[i][j] = matrix[i][j]-'0';
                //cout<<a[i][j]<<" ";
            }
            //cout<<endl;
        }

        int top = 0,sta[500+10];
        int heights[500+10];
        int ma = 0;
        for (int i = 0;i < n;i++){
            for (int j = 0;j<m;j++){
                heights[j+1] = a[i][j];
            }
            top = 0;
            heights[0] = 0;
            for (int j = 1;j <= m;j++){
                if (top==0 || heights[sta[top]]<=heights[j]){
                    sta[++top] = j;
                }else{
                    while (top>0 && heights[sta[top]]>heights[j]){
                        ma = max(ma,(j-1-sta[top-1])*heights[sta[top]]);
                        top--;
                    }
                    sta[++top] = j;
                }
            }
            while (top>0){
                ma = max(ma,(m-sta[top-1])*heights[sta[top]]);
                top--;
            }
        }
        return ma;
    }
};

原文地址:https://www.cnblogs.com/AWCXV/p/12293730.html

时间: 2024-11-09 04:03:08

【LeetCode 85】最大矩形(第二遍)的相关文章

[leetcode] 85. 最大矩形

85. 最大矩形 解法1: 一个思路就是这个可以看作84. 柱状图中最大的矩形的扩展,这道题的二维矩阵每一层向上都可以看做一个直方图,输入矩阵有多少行,就可以形成多少个直方图,对每个直方图都调用 84. 柱状图中最大的矩形 中的方法,就可以得到最大的矩形面积. class Solution { public int maximalRectangle(char[][] matrix) { int m = matrix.length; if (m == 0) return 0; int n = ma

【leetcode】柱状图中最大的矩形(第二遍)

题目链接 [题解] 考虑每个柱子为最高柱子对答案的贡献,就是看这个柱子往左能domain多少个单位 往右能domain多少个单位. 遇到比它小的为止 遍历所有的柱子为最高柱子的情况. 就能够覆盖到所有的矩形了. 也即枚举一个位置然后如果比它高就一直扩展,往左往右各做一次就好. 这样的时间复杂度是O(N^2)的 我们可以维护一个单调递增的队列. 这个队列里面第i个元素和第i-1个元素 假设他们原来在数组里的位置是 ii和jj 显然min(ii+1,jj)..jj这一段里面的柱子都是比i元素也即在原

[leetcode 85. 最大矩形] 单调栈--84题的简单扩展

题目描述 给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积. 示例: 输入: [ ["1","0","1","0","0"], ["1","0","1","1","1"], ["1","1","1","

开始刷第二遍

从9月12号开始,到现在三个多月了,现在进度是300/304,后面几题难度比较大,尤其是dietpepsi加的一些Dynamic Programming的新题,自己往往做不出来要去看答案.今天起决定暂停做新题了,从头开始刷第二遍,之后的新题目,等到第二遍结束的时候再尝试挑战. 第二遍打算在两个月内刷完,研究Discuss版,争取每道题目能有最优解法和多种解法, 也要进行仔细和正确的复杂度分析,注意coding style以及coding convention.同时还要全面补强数据结构和算法的知识

Winform and WPF 第二遍双击快捷方式或应用程序打开原来的应用程序而不新建一个实例[进程通信 1]

private void Window_Loaded(object sender, RoutedEventArgs e)         {             Process[] pro = Process.GetProcesses();             int n = pro.Where(p => p.ProcessName.Equals("进程名称")).Count();             if (n > 1)             {      

[leetcode]85. Maximal Rectangle 最大矩形

Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1's and return its area. Example: Input: [ ["1","0","1","0","0"], ["1","0","1",&qu

【leetcode 33】搜索旋转排序数组(第二遍)

题目链接 [题解] 如果没有旋转这么一说. 那么问题就是一道普通的二分查找的题目. 加上旋转之后.也没有让这个题变难多少. 问题的关键在于. 在二分查找的时候. 能够想到用nums[0]这个元素来确定当前二分枚举到的元素是在哪一个区间里面的. 即是在左边那个上升区间里面,还是在右边那个上升区间里面. 不过. 知道在哪个区间以后 还有一个问题. 就是我们不能单纯的就在那个区间里面做二分. 因为那个元素可能是在另外一个区间里的. 所以还得拿目标元素和nums[0]做一个对比. 比它小然后nums[m

LeetCode (85): Maximal Rectangle [含84题分析]

链接: https://leetcode.com/problems/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. [中文描述] 给一个二维数组, 算出里面最大的全1矩形面积,比如: [ ['1','1','1','0'], ['1','1','1','1']

[LeetCode] Second Highest Salary 第二高薪水

Write a SQL query to get the second highest salary from the Employee table. +----+--------+ | Id | Salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+ For example, given the above Employee table, the second highest salary is