leetcode 2943. 最大化网格图中正方形空洞的面积 中等

给你一个网格图,由 n + 2横线段m + 2竖线段 组成,一开始所有区域均为 1 x 1 的单元格。

所有线段的编号从 1 开始。

给你两个整数 nm

同时给你两个整数数组 hBarsvBars

  • hBars 包含区间 [2, n + 1]互不相同 的横线段编号。
  • vBars 包含 [2, m + 1]互不相同的 竖线段编号。

如果满足以下条件之一,你可以 移除 两个数组中的部分线段:

  • 如果移除的是横线段,它必须是 hBars 中的值。
  • 如果移除的是竖线段,它必须是 vBars 中的值。

请你返回移除一些线段后(可能不移除任何线段) ,剩余网格图中 最大正方形 空洞的面积,正方形空洞的意思是正方形 内部 不含有任何线段。

示例 1:

复制代码
输入:n = 2, m = 1, hBars = [2,3], vBars = [2]
输出:4
解释:左边的图是一开始的网格图。
横线编号的范围是区间 [1,4] ,竖线编号的范围是区间 [1,3] 。
可以移除的横线段为 [2,3] ,竖线段为 [2] 。
一种得到最大正方形面积的方法是移除横线段 2 和竖线段 2 。
操作后得到的网格图如右图所示。
正方形空洞面积为 4。
无法得到面积大于 4 的正方形空洞。
所以答案为 4 。

示例 2:

复制代码
输入:n = 1, m = 1, hBars = [2], vBars = [2]
输出:4
解释:左边的图是一开始的网格图。
横线编号的范围是区间 [1,3] ,竖线编号的范围是区间 [1,3] 。
可以移除的横线段为 [2] ,竖线段为 [2] 。
一种得到最大正方形面积的方法是移除横线段 2 和竖线段 2 。
操作后得到的网格图如右图所示。
正方形空洞面积为 4。
无法得到面积大于 4 的正方形空洞。
所以答案为 4 。

示例 3:

复制代码
输入:n = 2, m = 3, hBars = [2,3], vBars = [2,3,4]
输出:9
解释:左边的图是一开始的网格图。
横线编号的范围是区间 [1,4] ,竖线编号的范围是区间 [1,5] 。
可以移除的横线段为 [2,3] ,竖线段为 [2,3,4] 。
一种得到最大正方形面积的方法是移除横线段 2、3 和竖线段 3、4 。
操作后得到的网格图如右图所示。
正方形空洞面积为 9。
无法得到面积大于 9 的正方形空洞。
所以答案为 9 。

提示:

  • 1 <= n <= 10^9
  • 1 <= m <= 10^9
  • 1 <= hBars.length <= 100
  • 2 <= hBars[i] <= n + 1
  • 1 <= vBars.length <= 100
  • 2 <= vBars[i] <= m + 1
  • hBars 中的值互不相同。
  • vBars 中的值互不相同。

分析:删的线段越多,面积越大,先把所有能删的线段都删掉,计算最大的矩形,长宽分别是多少。取长宽的最小值,即为正方形的边长(多删的线段撤销删除)。 本题要做的是,把数组排序后,求最长连续递增子数组的长度加一。正方形的边长是长宽的最小值,其平方即为正方形的面积。

cpp 复制代码
int cmp(const void *a,const void *b)
{
    int aa=*(int*)a;
    int bb=*(int*)b;
    return aa-bb;
}
int maximizeSquareHoleArea(int n, int m, int* hBars, int hBarsSize, int* vBars, int vBarsSize) {
    qsort(hBars,hBarsSize,sizeof(int),cmp);
    qsort(vBars,vBarsSize,sizeof(int),cmp);
    int len1=1,num1=hBars[0],cnt1=1;
    for(int i=1;i<hBarsSize;++i)
    {
        if(hBars[i]==num1+1)num1=hBars[i],len1++,cnt1=fmax(cnt1,len1);
        else num1=hBars[i],len1=1;
    }
    int len2=1,num2=vBars[0],cnt2=1;
    for(int i=1;i<vBarsSize;++i)
    {
        if(vBars[i]==num2+1)num2=vBars[i],len2++,cnt2=fmax(cnt2,len2);
        else num2=vBars[i],len2=1;
    }
    int ans=fmin(cnt1,cnt2)+1;
    return ans*ans;
}
相关推荐
We་ct12 小时前
LeetCode 148. 排序链表:归并排序详解
前端·数据结构·算法·leetcode·链表·typescript·排序算法
x_xbx15 小时前
LeetCode:2. 两数相加
算法·leetcode·职场和发展
_日拱一卒15 小时前
LeetCode:最长连续序列
算法·leetcode·职场和发展
重生之后端学习15 小时前
287. 寻找重复数
数据结构·算法·leetcode·深度优先·图论
实心儿儿17 小时前
算法7:两个数组的交集
算法·leetcode·职场和发展
sheeta199817 小时前
LeetCode 每日一题笔记 日期:2025.03.19 题目:3212.统计X和Y频数相等的子矩阵数量
笔记·leetcode·矩阵
Storynone18 小时前
【Day28】LeetCode:509. 斐波那契数,70. 爬楼梯,746. 使用最小花费爬楼梯
python·算法·leetcode
博风19 小时前
算法:双指针解:盛最多水的容器
算法·leetcode
阿Y加油吧19 小时前
力扣打卡day05——找到字符串中所有字母异位词、和为K的子数组
leetcode
abant220 小时前
leetcode912 排序算法总结
算法·leetcode·排序算法