leetcode221 最大正方形

java 复制代码
class Solution {
    public int maximalSquare(char[][] matrix) {
        int row = matrix.length;
        int col = matrix[0].length;
        int[][] pref = new int[row + 1][col + 1];
        for (int i = 1; i < row + 1; i++) {
            for (int j = 1; j < col + 1; j++) {
                pref[i][j] = matrix[i - 1][j - 1] - '0' + pref[i - 1][j] + pref[i][j - 1] - pref[i - 1][j - 1];
            }
        }

        int maxSide = 0;

        for (int i = 1; i < row + 1; i++) {
            for (int j = 1; j < col + 1; j++) {
                for (int k = maxSide + 1; i - k >= 0 && j - k >= 0; k++) {
                    int sum = pref[i][j] - pref[i - k][j] - pref[i][j - k] + pref[i - k][j - k];
                    if (sum == k * k)
                        maxSide = k;

                }
            }
        }

        return maxSide * maxSide;

    }
}

在力扣中,这道题的最优解是动态规划(O(MN) 时间和 O(N) 空间),但前缀和方法对于解决"任意子矩形求和"类问题是通用的大杀器,非常值得掌握。

java 复制代码
public int maximalSquare(char[][] matrix) {
    int rows = matrix.length, cols = matrix[0].length;
    int[][] dp = new int[rows + 1][cols + 1];
    int maxSide = 0;

    for (int i = 1; i <= rows; i++) {
        for (int j = 1; j <= cols; j++) {
            if (matrix[i-1][j-1] == '1') {
                // 状态转移方程
                dp[i][j] = Math.min(Math.min(dp[i-1][j], dp[i][j-1]), dp[i-1][j-1]) + 1;
                maxSide = Math.max(maxSide, dp[i][j]);
            }
        }
    }
    return maxSide * maxSide;
}
相关推荐
vortex511 分钟前
几种 dump hash 方式对比分析
算法·哈希算法
Maynor99622 分钟前
OpenClaw 玩家必备:用 AI 自动追踪社区最新动态
java·服务器·人工智能
堕27426 分钟前
java数据结构当中的《排序》(一 )
java·数据结构·排序算法
亓才孓41 分钟前
[Class的应用]获取类的信息
java·开发语言
开开心心就好1 小时前
AI人声伴奏分离工具,离线提取伴奏K歌用
java·linux·开发语言·网络·人工智能·电脑·blender
2302_813806221 小时前
【嵌入式修炼:数据结构篇】——数据结构总结
数据结构
80530单词突击赢1 小时前
JavaWeb进阶:SpringBoot核心与Bean管理
java·spring boot·后端
Wei&Yan1 小时前
数据结构——顺序表(静/动态代码实现)
数据结构·c++·算法·visual studio code
爬山算法1 小时前
Hibernate(87)如何在安全测试中使用Hibernate?
java·后端·hibernate
云姜.2 小时前
线程和进程的关系
java·linux·jvm