zoukankan      html  css  js  c++  java
  • LeetCode 最大正方形

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

    示例:

    输入: 
    
    1 0 1 0 0
    1 0 1 1 1
    1 1 1 1 1
    1 0 0 1 0
    
    输出: 4
    解法:判断以某个点为正方形右下角时最大的正方形时,那它的上方,左方和左上方三个点也一定是某个正方形的右下角,否则该点为右下角的正方形最大就是它自己了。
    我们知道,该点为右下角的正方形的最大边长,最多比它的上方,左方和左上方为右下角的正方形的边长多1,最好的情况是是它的上方,左方和左上方为右下角的正方形的大小都一样的,这样加上该点就可以构成一个更大的正方形。
    但如果它的上方,左方和左上方为右下角的正方形的大小不一样,合起来就会缺了某个角落,这时候只能取那三个正方形中最小的正方形的边长加1了。
    class Solution {
    public:
        int maximalSquare(vector<vector<char>>& matrix) {
            if(matrix.empty() || matrix[0].empty()) 
                return 0;
            int n=matrix.size(),m=matrix[0].size();
            int ans=0;
            int dp[n][m];
            memset(dp,0,sizeof(dp));
            for(int i=0;i<n;i++)
            {
                if(matrix[i][0]=='1')
                {
                    dp[i][0]=1;ans=1;
                }
            }
            for(int i=0;i<m;i++)
            {
                if(matrix[0][i]=='1')
                {
                    dp[0][i]=1;ans=1;
                }
            }
            for(int i=1;i<n;i++)
            {
                for(int j=1;j<m;j++)
                {
                    if(matrix[i][j]=='1')
                        dp[i][j]=min(dp[i-1][j-1],min(dp[i-1][j],dp[i][j-1]))+1;
                    ans=max(ans,dp[i][j]);
                }
            }
            return ans*ans;
        }
    };
  • 相关阅读:
    数据结构10——最短路径
    获取JVM转储文件的Java工具类
    如何测试这个方法--性能篇
    如何测试这个方法--功能篇
    使用WireMock进行更好的集成测试
    性能测试框架第二版
    如何使用Selenium来计算自动化测试的投资回报率?
    模糊断言
    如何从测试自动化中实现价值
    如何获取JVM堆转储文件
  • 原文地址:https://www.cnblogs.com/jkzr/p/10610105.html
Copyright © 2011-2022 走看看