普通视图

发现新文章,点击刷新页面。
今天 — 2026年1月15日首页

n、m参数不用考虑,只需对hBars、vBars排序遍历计算,0ms双百

2023年11月26日 08:40

Problem: 100138. 最大化网格图中正方形空洞的面积

[TOC]

思路

分析题意:

  • 抽掉一根线,则空出空间: 2

  • 若存在连续 l 根线,抽出后,空出空间为: l + 1

  • hBars.length、vBars.length 至少为1,即必有线被抽掉,至少有空间 2

因此,贪心思路来考虑:

  • 第一步、对 hBars 和 vBars 排序

  • 第二步、分别求出 hBars 和 vBars 的连续最长线段

  • 第三步、取 hBars 和 vBars 的连续最长线段两者的较小值,平方后返回

此题,n、m 两个参数可以不用到。

Code

执行用时分布0ms击败100.00%;消耗内存分布6.47MB击败100.00%

###C

int cmp(const void* a, const void* b) {
    return *(int*)a - *(int*)b;
}
int maxlen(int* lst, int len) {
    qsort(lst, len, sizeof(int), cmp);
    int ma = 2, l = 2;
    for (int i = 0; i < len - 1; ++ i)
        if (lst[i + 1] - lst[i] == 1) { if (++ l > ma) ma = l; }
        else l = 2;
    return ma;
}
int maximizeSquareHoleArea(int n, int m, int* hBars, int hBarsSize, int* vBars, int vBarsSize) {
    int h = maxlen(hBars, hBarsSize), v = maxlen(vBars, vBarsSize);
    return h < v ? h * h : v * v;
}

###Python3

class Solution:
    def maximizeSquareHoleArea(self, n: int, m: int, hBars: List[int], vBars: List[int]) -> int:
        def maxlen(lst):
            ma, l = 2, 2
            for x, y in pairwise(sorted(lst)):
                if y - x == 1: 
                    l += 1
                    ma = max(ma, l)
                else:
                    l = 2
            return ma
        return min(maxlen(hBars), maxlen(vBars)) ** 2

您若还有不同方法,欢迎贴在评论区,一起交流探讨! ^_^

↓ 点个赞,点收藏,留个言,再划走,感谢您支持作者! ^_^

❌
❌