0
点赞
收藏
分享

微信扫一扫

leetcode - 221. 最大正方形

扬帆远航_df7c 2022-04-29 阅读 45
c++leetcode

leetcode - 221. 最大正方形

题目

在这里插入图片描述

代码

#include <iostream>
#include <vector>
using namespace std;

// 动态规划 
int maximalSquare(vector<vector<char> >& matrix) {
	int m = matrix.size();
	int n = matrix[0].size();
	if(m == 0 || n == 0){
		return 0;
	}
	int curSide = 0, res = 0;
	vector<vector<int> > dp(m, vector<int>(n));
	for(int i = 0; i < m; i++){
		for(int j = 0; j < n; j++){
			if(matrix[i][j] == '1'){
				if(i == 0 || j == 0){
					dp[i][j] = 1;
				}else{
					dp[i][j] = min(dp[i-1][j], min(dp[i][j-1], dp[i-1][j-1])) + 1;
				}
				curSide = max(curSide, dp[i][j]);
			}
		}
	}
	res = curSide * curSide;
	return res;
}

int maximalSquare1(vector<vector<char> >& matrix) {
	int m = matrix.size();
	int n = matrix[0].size();
	if(m == 0 || n == 0){
		return 0;
	}
	int res = 0;
	int count = 0, curSide = 0;
	for(int i = 0; i < m; i++){
		for(int j = 0; j < n; j++){
			if(matrix[i][j] == '1'){
				count = max(count, 1);
				curSide = min(m - i, n -j);
				for(int k = 1; k < curSide; k++){
					int flag = 1;
					if(matrix[i+k][j+k] == '0'){
						break;
					}
					for(int m = 0; m < k; m++){
						if(matrix[i+m][j+k] == '0' || matrix[i+k][j+m] == '0'){
							flag = 0;
							break;
						}
					}
					if(flag){
						count = max(count, k+1);
					}else{
						break;
					}
				}
			}
		}
	}
	res = count * count;
	return res;
}

int main(){
	int m, n, res;
	cin>>m>>n;
	vector<vector<char> > matrix(m, vector<char>(n));
	for(int i = 0; i < m; i++){
		for(int j = 0; j < n; j++){
			cin>>matrix[i][j];
		}
	}
	res = maximalSquare(matrix);
	cout<<res;
	return 0;
}
举报

相关推荐

0 条评论