给你一个网格图,由 n + 2 条 横线段 和 m + 2 条 竖线段 组成,一开始所有区域均为 1 x 1 的单元格。
所有线段的编号从 1 开始。
给你两个整数 n 和 m 。
同时给你两个整数数组 hBars 和 vBars 。
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^91 <= m <= 10^91 <= hBars.length <= 1002 <= hBars[i] <= n + 11 <= vBars.length <= 1002 <= vBars[i] <= m + 1hBars中的值互不相同。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;
}