首页 > 其他分享 >1139. 最大的以 1 为边界的正方形 (Medium)

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

时间:2023-02-28 17:01:12浏览次数:64  
标签:1139 Medium 前缀 int 正方形 vector grid size

问题描述

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

给你一个由若干 01 组成的二维网格 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]01

解题思路

利用前缀和来简化满足正方形条件的计算,枚举正方形边长,找到最大的l,再和已经得出的结果进行比较。

代码

class Solution {
  public:
    int largest1BorderedSquare(vector<vector<int>> &grid) {
        // 前缀和
        int m = grid.size(), n = grid[0].size();
        vector<vector<int>> sum_row(m, vector<int>(n + 1, 0)); // 每行前缀和
        vector<vector<int>> sum_col(m + 1, vector<int>(n, 0)); // 每列前缀和
        for (int i = 0; i < grid.size(); i++) {
            for (int j = 1; j <= n; j++) {
                sum_row[i][j] = sum_row[i][j - 1] + grid[i][j - 1];
            }
        }
        for (int i = 1; i <= m; i++) {
            for (int j = 0; j < n; j++) {
                sum_col[i][j] = sum_col[i - 1][j] + grid[i - 1][j];
            }
        }
        int res = 0;
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                for (int l = res + 1; l <= std::min(i, j); l++) { // 直接从res开始
                    if (sum_col[i][j - 1] - sum_col[i - l][j - 1] == l && sum_row[i - 1][j] - sum_row[i - 1][j - l] == l && sum_col[i][j - l] - sum_col[i - l][j - l] == l && sum_row[i - l][j] - sum_row[i - l][j - l] == l)
                        res = std::max(l, res);
                }
            }
        }
        return res * res;
    }
};

标签:1139,Medium,前缀,int,正方形,vector,grid,size
From: https://www.cnblogs.com/zwyyy456/p/17165082.html

相关文章

  • 1218.最长定差子序列 (Medium)
    问题描述1218.最长定差子序列(Medium)给你一个整数数组arr和一个整数difference,请你找出并返回arr中最长等差子序列的长度,该子序列中相邻元素之间的差等于differ......
  • 334. 递增的三元子序列 (Medium)
    问题描述334.递增的三元子序列(Medium)给你一个整数数组nums,判断这个数组中是否存在长度为3的递增子序列。如果存在这样的三元组下标(i,j,k)且满足i<j<k......
  • #yyds干货盘点# LeetCode程序员面试金典:平分正方形
    题目:给定两个正方形及一个二维平面。请找出将这两个正方形分割成两半的一条直线。假设正方形顶边和底边与x轴平行。每个正方形的数据square包含3个数值,正方形的左下顶点坐......
  • 417. Pacific Atlantic Water Flow[Medium]
    417.PacificAtlanticWaterFlowThereisanmxnrectangularislandthatbordersboththePacificOceanandAtlanticOcean.ThePacificOceantouchestheisl......
  • 133. Clone Graph[Medium]
    133.CloneGraphGivenareferenceofanodeinaconnectedundirectedgraph.Returnadeepcopy(clone)ofthegraph.Eachnodeinthegraphcontainsavalue......
  • 200. Number of Islands[Medium]
    200.NumberofIslandsGivenanmxn2Dbinarygridgridwhichrepresentsamapof'1's(land)and'0's(water),returnthenumberofislands.Anislandissu......
  • 【macOS软件】VMware Fusion 13.0.1(21139760)强大简单的虚拟机
    原文来源于黑果魏叔官网,转载需注明出处。应用介绍VMwareFusion是适用于Mac的强大简单的虚拟机,为Mac用户提供了在Mac上运行Windows以及与Mac应用程序并排运行的数百个其他操......
  • leetcode 221. 最大正方形
    dp[i][j]表示以(i,j)为右下角的正方形最大的边长转态转移方程:matrix[i][j]=='1': dp[i][j]=1+min(dp[i-1][j-1],min(dp[i][j-1],dp[i-1][j]));matrix[i][j]=='0':......
  • LeetCode 周赛 333,你管这叫 Medium 难度?
    本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]提问。大家好,我是小彭。上周是LeetCode第333场周赛,你参加了吗?这场周赛质量很高,但难度标得不对,我......
  • 39. Combination Sum[Medium]
    39.CombinationSumGivenanarrayofdistinctintegerscandidatesandatargetintegertarget,returnalistofalluniquecombinationsofcandidateswhereth......