LeetCode 1139. 最大的以 1 为边界的正方形(DP)

Nancy ·
更新时间:2024-09-20
· 533 次阅读

1. 题目

给你一个由若干 0 和 1 组成的二维网格 grid,请你找出边界全部由 1 组成的最大 正方形 子网格,并返回该子网格中的元素数量。如果不存在,则返回 0。

示例 1: 输入:grid = [[1,1,1],[1,0,1],[1,1,1]] 输出:9 示例 2: 输入:grid = [[1,1,0,0]] 输出:1 提示: 1 <= grid.length <= 100 1 <= grid[0].length <= 100 grid[i][j] 为 0 或 1

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/largest-1-bordered-square
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

参看 :程序员面试金典 - 面试题 17.23. 最大黑方阵(DP)

求得每个坐标位置处的 上方、左侧 连续的 1 有多少个 从右下角开始遍历每个位置,每个点的初始边长edge取 min(上、左) 检测另外两条边是不是也 >= edge,求取最大的边长 class Solution { public: int largest1BorderedSquare(vector<vector>& grid) { int m = grid.size(), n = grid[0].size(), i, j; vector<vector> sumof1Up(m, vector(n,0));//向上连续1的个数 vector<vector> sumof1Left(m, vector(n,0));//向左连续1的个数 for(i = 0; i < m; i++) { for(j = 0; j 0) { sumof1Left[i][j] = sumof1Left[i][j-1]+1; sumof1Up[i][j] = 1; } else if(j==0 && i > 0) { sumof1Left[i][j] = 1; sumof1Up[i][j] = sumof1Up[i-1][j]+1; } else { sumof1Left[i][j] = sumof1Left[i][j-1]+1; sumof1Up[i][j] = sumof1Up[i-1][j]+1; } } } } int maxEdge = 0, edge, x, y; for(i = m-1; i >= 0; i--) { for(j = n-1; j >= 0; --j) { edge = min(sumof1Up[i][j], sumof1Left[i][j]); //初始边长 while(edge > 0) { if(maxEdge > edge)//肯定小,不必检查了 break; x = i-edge+1;//上方边的x y = j-edge+1;//左侧边的y if(sumof1Up[i][y]>=edge && sumof1Left[x][j]>=edge) { //左侧边 上侧边长都大于等 edge maxEdge = edge; } edge--;//遍历所有可能 } } } return maxEdge*maxEdge; } };

44 ms 11.3 MB


作者:Michael阿明



dp leetcode 边界

需要 登录 后方可回复, 如果你还没有账号请 注册新账号