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;
}
相关推荐
_深海凉_1 小时前
LeetCode热题100-寻找两个正序数组的中位数
算法·leetcode·职场和发展
踩坑记录2 小时前
leetcode hot100 寻找两个正序数组的中位数 hard 二分查找 双指针
leetcode
superior tigre5 小时前
78 子集
算法·leetcode·深度优先·回溯
superior tigre7 小时前
739 每日温度
算法·leetcode·职场和发展
6Hzlia7 小时前
【Hot 100 刷题计划】 LeetCode 15. 三数之和 | C++ 排序+双指针
c++·算法·leetcode
北顾笙9808 小时前
day37-数据结构力扣
数据结构·算法·leetcode
6Hzlia11 小时前
【Hot 100 刷题计划】 LeetCode 189. 轮转数组 | C++ 三次反转经典魔法 (O(1) 空间)
c++·算法·leetcode
m0_6294947311 小时前
LeetCode 热题 100-----13.最大子数组和
数据结构·算法·leetcode
田梓燊12 小时前
力扣:94.二叉树的中序遍历
数据结构·算法·leetcode
khalil102012 小时前
代码随想录算法训练营Day-38动态规划06 | 322. 零钱兑换、279.完全平方数、139.单词拆分、多重背包、总结
数据结构·c++·算法·leetcode·动态规划