最大正方形问题

最大,正方形,问题 · 浏览次数 : 48

小编点评

**最大正方形问题作者:Grey原文地址:博客园:最大正方形问题CSDN:最大正方形问题题目描述** **题目描述:** 在由 '0' 和 '1' 组成的二维矩阵内,找到只包含 '1' 的最大正方形,并返回其面积。 **思路:** * 定义二维数组 `dp`,其中 `dp[i][j]` 表示正方形必须以 `i, j` 作为右下角的情况下,哪个正方形内部都是 1 且最大。 * 考虑普遍位置,并根据左右、上、左上三个位置的值来计算 `dp[i][j]` 的值。 * 最外层循环从 `1` 到 `m` 行,从 `1` 到 `n` 列遍历矩阵。 * `dp[i][j]` 的值取决于 `dp[i - 1][j - 1]`, `dp[i - 1][j]` 和 `dp[i][j - 1]` 的最小值。 * `dp[i][j]` 的最终结果就是所有包含 '1' 的最大正方形的面积之和。 **代码:** ```python class Solution: def maximalSquare(self, matrix: List[List[str]]) -> int: if not matrix or len(matrix) == 0 or len(matrix[0]) == 0: return 0 m, n = len(matrix), len(matrix[0]) # Initialize dp matrix dp = [[0] * n for _ in range(m)] for _ in range(n)] # Initialize first row and first column for i in range(m): dp[i][0] = matrix[i][0] == '1' max = max(dp[i][0], i) for i in range(n): dp[0][i] = matrix[0][i] == '1' max = max(dp[0][i], i) # Fill dp matrix for i in range(1, m): for j in range(1, n): dp[i][j] = matrix[i][j] == '1' if dp[i - 1][j - 1] == dp[i - 1][j] else min(dp[i - 1][j - 1], dp[i - 1][j]) + 1 return max * max ```

正文

最大正方形问题

作者:Grey

原文地址:

博客园:最大正方形问题

CSDN:最大正方形问题

题目描述

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

题目链接见:LeetCode 221. Maximal Square

主要思路

本题思路比较简单,可以定义一个二维数组dp,二维数组dp的规模和原始矩阵的规模一样。

int m = matrix.length;
int n = matrix[0].length;
int[][] dp = new int[m][n];

其中dp[i][j]表示正方形必须以 i, j 作为右下角的情况下,哪个正方形内部都是 1 且最大

有一个很显而易见的结论,如果matrix[i][j] == '0',则dp[i][j] = 0,接下来是 base case,

第一行和第一列的值很容易可以得到

  for (int i = 0; i < m; i++) {
    dp[i][0] = matrix[i][0] == '1' ? 1 : 0;
    max = Math.max(dp[i][0], max);
}
for (int i = 0; i < n; i++) {
    dp[0][i] = matrix[0][i] == '1' ? 1 : 0;
     max = Math.max(dp[0][i], max);
}

注:max变量用于记录全局最大值。

考虑普遍位置,如下图

img

观察dp[i][j]周围的位置依赖,有如下两种情况

img

img

其中dp[i-1][j]表示的区域是绿色部分的正方形,dp[i-1][j-1]表示的区域是红色部分的正方形,dp[i][j-1]表示蓝色区域部分的正方形,基于上述上个位置的值,可以得到dp[i][j]的值,即dp[i][j]依赖其左边一个位置,上面一个位置,左上角位置

代码如下

        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                dp[i][j] = matrix[i][j] == '1' ? Math.min(Math.min(dp[i - 1][j - 1], dp[i - 1][j]), dp[i][j - 1]) + 1 : 0;
                max = Math.max(dp[i][j], max);
            }
        }

完整代码见

class Solution {
    public int maximalSquare(char[][] matrix) {
        if (null == matrix || matrix.length == 0 || matrix[0].length == 0) {
            return 0;
        }
        int m = matrix.length;
        int n = matrix[0].length;
        int max = 0;
        // tips 正方形必须以i,j作为右下角情况,哪个正方形内部都是1且最大
        int[][] dp = new int[m][n];
        for (int i = 0; i < m; i++) {
            dp[i][0] = matrix[i][0] == '1' ? 1 : 0;
            max = Math.max(dp[i][0], max);
        }
        for (int i = 0; i < n; i++) {
            dp[0][i] = matrix[0][i] == '1' ? 1 : 0;
            max = Math.max(dp[0][i], max);
        }
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                dp[i][j] = matrix[i][j] == '1' ? Math.min(Math.min(dp[i - 1][j - 1], dp[i - 1][j]), dp[i][j - 1]) + 1 : 0;
                max = Math.max(dp[i][j], max);
            }
        }
        return max * max;
    }
}

更多

算法和数据结构笔记

与最大正方形问题相似的内容:

最大正方形问题

最大正方形问题 作者:Grey 原文地址: 博客园:最大正方形问题 CSDN:最大正方形问题 题目描述 在一个由 '0' 和 '1' 组成的二维矩阵内,找到只包含 '1' 的最大正方形,并返回其面积。 题目链接见:LeetCode 221. Maximal Square 主要思路 本题思路比较简单,

子数组的最大异或和问题

子数组的最大异或和问题 作者:Grey 原文地址: 博客园:子数组的最大异或和问题 CSDN:子数组的最大异或和问题 题目描述 数组中所有数都异或起来的结果,叫做异或和。给定一个数组 arr,其中可能有正、有负,有零,返回 arr 的最大子数组异或和 题目链接见:牛客-子数组的最大异或和 暴力解 枚

跨机房ES同步实战

作者:谢泽华 背景 众所周知单个机房在出现不可抗拒的问题(如断电、断网等因素)时,会导致无法正常提供服务,会对业务造成潜在的损失。所以在协同办公领域,一种可以基于同城或异地多活机制的高可用设计,在保障数据一致性的同时,能够最大程度降低由于机房的仅单点可用所导致的潜在高可用问题,最大程度上保障业务的用

[转帖]M.2固态硬盘需要装散热片吗?M.2 SSD装散热马甲降温效果明显吗?

http://www.lotpc.com/yjzs/9426.html 随着M.2 NVMe固态硬盘价格越来越实惠,并逐渐替代SATA固态硬盘,如今装机几乎成为了标配。众所周知,M.2 NVMe固态硬盘最大优势无疑是性能强劲,并且在体积上更小,但正是这种优势,同时也导致了热量的堆积的问题。那么M.2

FinOps首次超越安全成为企业头等大事丨云计算趋势报告

随着云计算在过去十年中的广泛应用,云计算用户所面临的一个持续不变的趋势是:安全一直是用户面临的首要挑战。然而,这种情况正在发生转变。 知名IT软件企业 Flexera 对云计算决策者进行年度调研已经持续12年,而今年安全问题首次没有成为最大挑战。在3月8日发布的《Flexera 2023年云计算现状

[转帖]配置Jmeter压测结果在Grafana展示

https://cloud.tencent.com/developer/article/1782473?areaSource=&traceId= 最近正在研究Jenkins的CICD,其中有个环节就是stress test 压力测试。 原打算使用 taurus 来做压测的,但是遇到了些问题,时间有限

Windows pyinstaller wxPython pyecharts无法正常显示问题

Windows pyinstaller wxPython pyecharts无法正常显示问题 最近遇到一个pyinstaller打包wxPython pyecharts无法显示的问题,pyecharts生成的html页面显示空白。未使用pyinstaller打包时显示正常。 问题原因 WebView

物联网浏览器(IoTBrowser)-基于计算机视觉开发的应用“智慧眼AIEye”

一、起因 最近毕业在家:),准备筹划社区运营和IoTBrowser升级的事务,遇到了一系列物业管理上的问题,本来出于好心提醒物业人员,结果反被误认为是打广告推销的,当时被激怒一下,后面一想也许这也是一个普遍存在的问题,正好IoTBrowser缺少落地的应用场景,遂又撸起袖子搞了一个AI工具。以下是本

记录freeswitch的一个2833问题

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 运营商内部新老系统混用,互联互通的问题较多,其中以DTMF码的问题最多,花样也多。 环境 CentOS 7.9 freeswitch 1.10.7 问题描述 问题现象 正常的fs业务服务器,呼叫正常,部分呼叫报错DTMF收码失败。

C#高性能数组拷贝实验

前言 昨天 wc(Wyu_Cnk) 提了个问题 C# 里多维数组拷贝有没有什么比较优雅的写法? 这不是问对人了吗?正好我最近在搞图像处理,要和内存打交道,我一下就想到了在C#里面直接像C/C++一样做内存拷贝。 优雅?no,要的就是装逼,而且性能还要强🕶 概念 首先澄清一下 C# 里的多维数组 (