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;
}
相关推荐
独自破碎E2 小时前
包含min函数的栈
android·java·开发语言·leetcode
Tisfy2 小时前
LeetCode 2943.最大化网格图中正方形空洞的面积:小小思维
算法·leetcode·题解·数组·思维·排序·连续
平生不喜凡桃李3 小时前
LeetCode: 基本计算器详解
算法·leetcode·计算器·逆波兰表达式
Swift社区3 小时前
LeetCode 375 - 猜数字大小 II
算法·leetcode·swift
漫随流水3 小时前
leetcode算法(257.二叉树的所有路径)
数据结构·算法·leetcode·二叉树
有一个好名字3 小时前
力扣-二叉树的最大深度
算法·leetcode·深度优先
MSTcheng.3 小时前
【算法】滑动窗口解决力扣『水果成篮』问题
算法·leetcode·哈希算法
独自破碎E4 小时前
【单调队列】滑动窗口的最大值
leetcode
June`15 小时前
全排列与子集算法精解
算法·leetcode·深度优先