码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode | 221. 最大正方形

时间:2019-11-04 11:38:58      阅读:56      评论:0      收藏:0      [点我收藏+]

标签:medium   说明   spl   title   必须   图片   png   amp   nbsp   

原题Medium):

  在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。

  技术图片

 

 

 

思路:动态规划

  如果某一个点 [i][j] 的值为1,我们不妨可以假设它是一个正方形的右下角,且另起一个数组dp,记录该点所在的正方形的边长,即使有可能它周围点都是0,但它自己本身也是一个边长为1的正方形,所以这个假设是可行的。该点为右下角的正方形的最大边长,最多比它的上方,左方和左上方为右下角的正方形的边长多1。要想它是一个边长为3的正方形的右下角,那么它的左上[i-1][j-1],左前[i][j-1],上方[i-1][j]的点(这些点也被赋予了作为某一正方形右下角的意义,记录的是其所在的正方形的边长)在数组dp里的值也必须记录为2。如果它们其中有的点值为0或为1,说明以[i][j]为右下角且边长为2的正方形不存在,取这些点的最小值+1,即为点 [i][j] 所在的正方形的边长:

技术图片

 

 

 

技术图片

 

 

 

 1     int maximalSquare(vector<vector<char>>& matrix) {
 2         if(matrix.empty()) return 0;
 3         vector<vector<int>> dp(matrix.size(),vector<int>(matrix[0].size(),0));
 4         
 5         for(int i = 0;i<matrix[0].size();i++)
 6             if(matrix[0][i] == 1)
 7                 dp[0][i] = 1;
 8             else dp[0][i] = 0;
 9         for(int i = 0;i<matrix.size();i++)
10             if(matrix[i][0] == 1)
11                 dp[i][0] = 1;
12             else dp[i][0] = 0;
13         
14         for(int i = 1;i<matrix.size();i++)
15             for(int j = 1; j <matrix[i].size();j++)
16             {
17                 if(matrix[i][j]==1)
18                 {
19                     int min = dp[i][j-1] < dp [i-1][j] ? dp[i][j-1] : dp[i-1][j];
20                     min = min< dp[i-1][j-1] ? min : dp[i-1][j-1];
21 
22                     dp[i][j] = min+1;
23                 }
24             }
25         
26         int max = dp[0][0];
27         for(int i = 0;i<matrix.size();i++)
28             for(int j =0; j <matrix[i].size();j++)
29                 max = max > dp[i][j] ? max : dp[i][j];
30         return max*max;
31     }

技术图片

LeetCode | 221. 最大正方形

标签:medium   说明   spl   title   必须   图片   png   amp   nbsp   

原文地址:https://www.cnblogs.com/MisakiJH/p/11790835.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!