LeetCode-221. 最大正方形

一时失言乱红尘 2024-03-23 10:06 240阅读 0赞

目录

    • 题目思路
    • 动态规划
    • 动态规划(优化)

题目来源
221. 最大正方形

题目思路

  • 现在我们需要找到只包含 ‘1’ 的最大正方形。首先,我们可以初始化一个和原始矩阵相同大小的矩阵 dp,用来记录每个格子所在的最大正方形的边长。
  • 对于第一行和第一列的格子,它们的 dp 值只能是 0 或 1,因为它们的左侧或上侧没有格子。我们可以直接将原始矩阵的值转换为 dp 矩阵的值。
  • 对于其他格子,如果它的值为 ‘1’,则它所在的最大正方形的边长至少为 1。我们可以根据它左侧、上侧和左上方格子的 dp 的最小值+1来计算当前格子的 dp 值

    dp[i][j] = min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]) + 1

如果无法理解的话,可以简单画一个图自己理解一下
在这里插入图片描述

动态规划

  • 1.确定dp数组以及下标的含义

用 dp(i, j) 表示以 matrix[i][j] 为右下角的最大正方形的边长。

  • 2.确定递推公式

如果它的值为 ‘1’,则它所在的最大正方形的边长至少为 1。我们可以根据它左侧、上侧和左上方格子的 dp 的最小值+1来计算当前格子的 dp 值

  1. dp[i][j] = min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]) + 1
  • 3.dp数组如何初始化

对于第一行和第一列的格子,它们的 dp 值只能是 0 或 1,因为它们的左侧或上侧没有格子。我们可以直接将原始矩阵的值转换为 dp 矩阵的值。

  1. for(int i = 0;i<row;i++){
  2. dp[i][0] = matrix[i][0]-'0';
  3. res = Math.max(res,dp[i][0]);
  4. }
  5. for(int j = 1;j<col;j++){
  6. dp[0][j] = matrix[0][j]-'0';
  7. res = Math.max(res,dp[0][j]);
  8. }
  • 4.确定遍历顺序

从递推公式dp[i][j] = min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]) + 1可知,遍历顺序从上到下,从左到右

  • 5.举例推导dp数组

以输入:matrix = [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”,“1”,“1”,“1”],[“1”,“0”,“0”,“1”,“0”]]为例
在这里插入图片描述

代码实现

  1. class Solution {
  2. public int maximalSquare(char[][] matrix) {
  3. int row = matrix.length;
  4. int col = matrix[0].length;
  5. int res = 0;
  6. int[][] dp = new int[row][col];
  7. for(int i = 0;i<row;i++){
  8. dp[i][0] = matrix[i][0]-'0';
  9. res = Math.max(res,dp[i][0]);
  10. }
  11. for(int j = 1;j<col;j++){
  12. dp[0][j] = matrix[0][j]-'0';
  13. res = Math.max(res,dp[0][j]);
  14. }
  15. for(int i = 1;i<row;i++){
  16. for(int j = 1;j<col;j++){
  17. if(matrix[i][j] == '1'){
  18. dp[i][j] = Math.min(dp[i-1][j],Math.min(dp[i-1][j-1],dp[i][j-1]))+1;
  19. res = Math.max(res,dp[i][j]);
  20. }
  21. }
  22. }
  23. return res*res;
  24. }
  25. }

在这里插入图片描述

动态规划(优化)

我们其实可以不用进行初始化,但我们需要把数组扩大一格,这样就不用考虑Math.min(dp[i-1][j],Math.min(dp[i-1][j-1],dp[i][j-1]))+1左边,上边,左上角了
在这里插入图片描述

  1. class Solution {
  2. public int maximalSquare(char[][] matrix) {
  3. int row = matrix.length;
  4. int col = matrix[0].length;
  5. int res = 0;
  6. int[][] dp = new int[row+1][col+1];
  7. for(int i = 1;i<=row;i++){
  8. for(int j = 1;j<=col;j++){
  9. if(matrix[i-1][j-1] == '1'){
  10. dp[i][j] = Math.min(dp[i-1][j],Math.min(dp[i-1][j-1],dp[i][j-1]))+1;
  11. res = Math.max(res,dp[i][j]);
  12. }
  13. }
  14. }
  15. return res*res;
  16. }
  17. }

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,240人围观)

还没有评论,来说两句吧...

相关阅读

    相关 221. 正方形

    打卡!!!每日一题 今天继续给大家分享一道动态规划类型的题目,不过该题目的状态转移方程比较难以理解,我会详细的给大家分析一下 题目描述: > 在一个由 ‘0’ 和 ‘1’

    相关 221. 正方形

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

    相关 Leetcode 221 正方形(DP)

    题目重述 在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内,找到只包含 ‘1’ 的最大正方形,并返回其面积。 示例 1: ![在这里插入图片描述][watermark