【LeetCode】85. Maximal Rectangle【未完待续】

本文探讨了一个经典的算法问题,即在一个二维二进制矩阵中寻找由1组成的最大矩形区域,并计算其面积。文章提供了一种基于线性时间复杂度的一维最大子串和算法的解决方案,通过控制列的起点和终点来快速判断某一行的两个位置间是否全为1。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

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","1","1"],
  ["1","1","1","1","1"],
  ["1","0","0","1","0"]
]
Output: 6

 

描述:

给出一个包含一位二进制数的矩阵,请求输出该矩阵中仅由1组成的最大矩阵所包含的1的个数

 

分析:

最直接思路:

对于一维的数组,如果求最大子串和,最快的算法是线性的,可以借用这个思想,快速判断某一行的两个位置之间是否全是1,

即只需要控制列的起点和终点即可,侥幸AC了, 不过只优于6%的提交者,可以再想想怎么优化

 

 

 

代码一:(时间复杂度O(m*n^2),n,m 分别为矩阵的行和列)

class Solution {
public:
	int maximalRectangle(vector<vector<char>>& matrix) {
		if (!matrix.size() || !matrix[0].size()) {
			return 0;
		}
		for (int i = 0; i < matrix.size(); ++ i) {
			matrix[i][0] -= '0';
			for(int j = 1; j < matrix[0].size(); ++ j) {
				matrix[i][j] = matrix[i][j] - '0' + matrix[i][j - 1];
			}
		}
		int result = 0;
		for (int i = 0; i < matrix[0].size(); ++ i) {
			for (int j = i; j < matrix[0].size(); ++ j) {
				caculate(matrix, i, j, result);
			}
		}
		return result;
	}
	void caculate(const vector<vector<char>>& matrix, int col_begin, int col_end, int &result) {
		int temp = 0, count = col_end - col_begin + 1;
		for (int i = 0; i < matrix.size(); ++ i) {
			int last_sum = 0;
			if (col_begin) {
				last_sum = matrix[i][col_begin - 1];
			}
			temp += count;
			int dis = matrix[i][col_end] - last_sum;
			if (dis != count) {
				temp = 0;
			}
			result = max(result, temp);
		}
	}
};

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值