zoukankan      html  css  js  c++  java
  • leetcode 221. 最大正方形

    题目描述:

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

    思路分析:

    一道动态规划的题。由于是正方形,首先单一的‘1’即为最小的正方形,接下来需要考察其外围区域是否为1。具体来说,dp[i][j]表示包含该点的最大正方形的边长。同时不断去更新这个最大边长。这里的递推是从前向后,如dp[i][j]=1,那么需要看dp[i-1][j],dp[i][j-1]以及dp[i-1][j-1]三个部分,动态递推公式为dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1])+1,更新最大边长。需要注意两个边界,即第一行和第一列,直接判断01,赋值即可。

    代码:

     1 class Solution {
     2 public:
     3     int maximalSquare(vector<vector<char>>& matrix) {
     4         int row = matrix.size();
     5         if(row == 0)
     6             return 0;
     7         int col = matrix[0].size();
     8         vector<vector<int>> res(row, vector<int>(col, 0));
     9         int maxval = 0;
    10         for(int i=0; i<row; i++)
    11         {
    12             res[i][0] = matrix[i][0]-'0';
    13             maxval = max(maxval, res[i][0]);
    14         }
    15         for(int i=0; i<col; i++)
    16         {
    17             res[0][i] = matrix[0][i]-'0';
    18             maxval = max(maxval, res[0][i]);
    19         }
    20         for(int i=1; i<row; i++)
    21         {
    22             for(int j=1; j<col; j++)
    23             {
    24                 if(matrix[i][j] == '0')
    25                     res[i][j] = 0;
    26                 else
    27                 {
    28                     res[i][j] = min(res[i-1][j-1], min(res[i-1][j], res[i][j-1]))+1;
    29                     maxval = max(maxval, res[i][j]);
    30                 }
    31             }
    32         }
    33         return maxval*maxval;
    34     }
    35 };
  • 相关阅读:
    纸牌游戏
    万圣节派对
    士兵杀敌(三)简单线段树
    百度之星2016资格赛之部分题解
    hdu Simpsons’Hidden Talents(kmp)
    滑梯理论
    PAP认证方式原理和实现
    Google的Protobuf协议分析
    HMac基本介绍
    为Tcl编写C的扩展库
  • 原文地址:https://www.cnblogs.com/LJ-LJ/p/11323197.html
Copyright © 2011-2022 走看看