给你一个由若干 0 和 1 组成的二维网格 grid,请你找出边界全部由 1 组成的最大 正方形 子网格,并返回该子网格中的元素数量。如果不存在,则返回 0。 来源:力扣(LeetCode) 参看 :程序员面试金典 – 面试题 17.23. 最大黑方阵(DP) 44 ms 11.3 MB
1. 题目
示例 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
链接:https://leetcode-cn.com/problems/largest-1-bordered-square
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。2. 解题
class Solution { public: int largest1BorderedSquare(vector<vector<int>>& grid) { int m = grid.size(), n = grid[0].size(), i, j; vector<vector<int>> sumof1Up(m, vector<int>(n,0));//向上连续1的个数 vector<vector<int>> sumof1Left(m, vector<int>(n,0));//向左连续1的个数 for(i = 0; i < m; i++) { for(j = 0; j < n; j++) { if(grid[i][j] == 1) { if(i==0 && j==0) sumof1Left[i][j] = 1, sumof1Up[i][j] = 1; else if(i==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; } };
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算