【leetcode】Maximal Rectangle (hard)★

本文介绍了一种求解二维二进制矩阵中最大全1子矩阵面积的算法。通过预处理得到每列连续1的数量,并以此为基础计算可能的最大矩形面积。文中提供了两种实现方案:一种使用额外矩阵存储信息;另一种采用栈优化空间复杂度。

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

 

找到01矩形中最大的全1子矩阵。

 

我自己的思路:

      我先用一个跟输入相同大小的矩阵numInCol 存储从当前位置开始向下有多少连续的1。

  如   

1 0 1
0 1 1
1 1 1

其numInCol 是

1 0 3
0 2 2
1 1 1

然后用一个变量tmpans来记录以某个位置开始,其右下矩形的最大全1矩阵的大小。

方法是如果当前位置是1,则用1 * numInCol[当前位置]     即只有这一列的大小

         如果其后面紧接着的位置也是1,则用 2 * (这两列中连续1高度小的值)  即这两列的矩形大小

         如果其后面紧接着的位置也是1,则用 3 * (这三列中连续1高度小的值)  即这三列的矩形大小

         ........................

         依次类推

#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;

class Solution {
public:
    int maximalRectangle(vector<vector<char> > &matrix) {
        if(matrix.empty())
            return 0;

        int row = matrix.size();
        int col = matrix[0].size();
        int ans = 0;

        vector<vector<int> > numInCol(row, vector<int>(col, 0));
        int tmpans = 0;

        //对每一列
        for(int j = 0; j < col; j++)
        {
            numInCol[row - 1][j] = (matrix[row - 1][j] == '1') ? 1 : 0;
            for(int i = row - 2; i >= 0; i--)
            {
                if(matrix[i][j] == '1')
                {
                    numInCol[i][j] = numInCol[i + 1][j] + 1;
                }
            }
        }

        //对整个矩阵
        for(int i = row - 1; i >= 0; i--)
        {
            tmpans = numInCol[i][col - 1];
            ans = max(ans, tmpans);
            for(int j = col - 2; j >= 0; j--)
            {
                int jj = j;
                int len = 1;
                int minlen = numInCol[i][j];
                while(jj < col && matrix[i][jj] == '1')
                {
                    minlen = min(minlen, numInCol[i][jj]);
                    tmpans = max(tmpans, len * minlen);
                    ans = max(ans, tmpans);
                    jj++;
                    len++;

                }
            }
        }

        return ans;
    }
};

int main()
{
    Solution s;
    vector<vector<char> > matrix(4, vector<char>(5, '0'));
    matrix[0][1] = '1';
    matrix[0][2] = '1';
    matrix[0][3] = '1';
    matrix[1][1] = '1';
    matrix[1][2] = '1';
    matrix[2][1] = '1';
    matrix[2][2] = '1';
    matrix[2][3] = '1';

    int ans = s.maximalRectangle(matrix);

    return 0;
}

 

网上的答案,整体的思路差不多,也是通过一列列的数据来判断,但是并没有像我一样,把所有的值都存下来,而是只存了一行的列信息,每到新的一行再更新,这样空间少了很多。其次,没有像我这样每次都循环后面的列是否为1,而是利用栈,如果高度是递增的就先不计算最大矩形而是把信息压栈,等到遇到高度减少的时候再依次计算这一段的最大矩形。

class Solution {
public:
    int maximalRectangle(vector<vector<char>> &matrix) {
        if (matrix.empty()) return 0;
        int rows = matrix.size();
        int cols = matrix[0].size();
        int maxArea = 0;
        vector<int> heights(cols + 1, 0);
        vector<int> stack;
        for (int i = 0; i < rows; i++) {
            stack.clear();
            for (int j = 0; j < cols + 1; j++) {
                if (j < cols) {
                    if (matrix[i][j] == '1') {
                        heights[j]++;
                    } else {
                        heights[j] = 0;
                    }
                }
                if (stack.empty() || heights[j] >= heights[stack.back()]) {
                    stack.push_back(j);
                    continue;
                }
                while (!stack.empty() && heights[j] < heights[stack.back()]) {
                    int top = stack.back();
                    stack.pop_back();
                    int begin = stack.empty() ? 0 : stack.back() + 1;
                    int area = heights[top] * (j - begin);
                    if (area > maxArea) maxArea = area;
                }
                stack.push_back(j);
            }
        }
        return maxArea;
    }
};

 

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值