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;
}
相关推荐
Tisfy1 天前
LeetCode 3637.三段式数组 I:一次遍历(三种实现)
算法·leetcode·题解·模拟·数组·遍历·moines
期末考复习中,蓝桥杯都没时间学了1 天前
力扣刷题15
算法·leetcode·职场和发展
im_AMBER1 天前
Leetcode 111 两数相加
javascript·笔记·学习·算法·leetcode
TracyCoder1231 天前
LeetCode Hot100(21/100)——234. 回文链表
算法·leetcode·链表
@––––––1 天前
力扣hot100—系列1
算法·leetcode·职场和发展
老鼠只爱大米1 天前
LeetCode经典算法面试题 #236:二叉树的最近公共祖先(RMQ转化、Tarjan离线算法等五种实现方案详细解析)
算法·leetcode·二叉树·lca·并查集·最近公共祖先·rmq
愚者游世1 天前
力扣解决二进制&题型常用知识点梳理
c++·程序人生·算法·leetcode·职场和发展·改行学it
圣保罗的大教堂1 天前
leetcode 3640. 三段式数组 II 困难
leetcode
Geoking.1 天前
前缀和算法:从一道 LeetCode 题看区间求和优化思想
算法·leetcode·职场和发展
执着2591 天前
力扣102、二叉树的层序遍历
数据结构·算法·leetcode