您的位置:首页 > 其它

Maximal Square leetcode

2015-08-21 23:52 239 查看
Given a 2D binary matrix filled with 0's and 1's, find the largest square containing all 1's and return its area.

For example, given the following matrix:

1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0

Return 4.

分析:这是一道DP题,首先说明,动态规划最重要的就是要找到那个递推公式!然而这道题目的递推公式,我也是网上搜索到的!无法正面递归过去。但是,我认为,数学中的一句名言:你解决的问题越多,你能解决下一道问题的概率就越大。所以好好加油吧,自己接触动态规划的时间还不长,加强训练,好好加油!

该题的递推公式:首先令f(i,j)表示以(i,j)为右下角的正方形的边长(构成最大的全'1'正方形)。

  那么,f(i,j)=Min{f(i-1,j),f(i-1,j-1),f(i,j-1)}+1,该公式的前提是:当前点(i,j)的值必须为1.

  递归,应当从左上角开始,逐行遍历下去,当然第一行(序号0),第一列(序号为0)没有必要进行,直接将其值初始化为所在点的原值。

  代码如下:(首先去除数组为空之类的边界条件)

  

#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
if (matrix.size() == 0)
return 0;
if (matrix.size() == 1)
{
int flag = 0;
for (int i = 0; i < matrix[0].size(); ++i)
{
if (matrix[0][i] == '1')
flag=1;
}
return flag;
}
int max = 0;
vector<vector<int>> mark;
for (int i = 0; i < matrix.size(); ++i)
{
vector<int> temp = {};
for (int j = 0; j < matrix[i].size(); ++j)
{
if (matrix[i][j] == '1')
{
temp.push_back(1);
}
else temp.push_back(0);
}
mark.push_back(temp);
}
for (int i = 0; i < mark.size();++i)
for (int j = 0; j < mark[i].size(); ++j)
{
if (i>0&&j>0&&1 == mark[i][j])
mark[i][j] = threeMin(mark[i - 1][j], mark[i - 1][j - 1], mark[i][j - 1]) + 1;
if (mark[i][j]>max)
max = mark[i][j];
}
return max*max;
}
int threeMin(int v1, int v2, int v3)
{
int temp = v1 < v2 ? v1 : v2;
return temp < v3 ? temp : v3;
}
};
int main()
{
Solution test;
vector<vector<char>> val = {
{'0','0','1'},
{'1','1','1'},
{'0','1','1'}
};
//vector<vector<char>> val = {
//    {  '0', '1' },
//    { '1', '0'},
//};
int resu = test.maximalSquare(val);
cout << resu << endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: