news 2026/8/29 7:29:10

LeetCode 2943.最大化网格图中正方形空洞的面积:小小思维

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode 2943.最大化网格图中正方形空洞的面积:小小思维

【LetMeFly】2943.最大化网格图中正方形空洞的面积:小小思维

力扣题目链接:https://leetcode.cn/problems/maximize-area-of-square-hole-in-grid/

给你一个网格图,由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 <= 109
  • 1 <= m <= 109
  • 1 <= hBars.length <= 100
  • 2 <= hBars[i] <= n + 1
  • 1 <= vBars.length <= 100
  • 2 <= vBars[i] <= m + 1
  • hBars中的值互不相同。
  • vBars中的值互不相同。

解题方法:最大连续

简单换个思维,m i n ( 水平方向移除一些线后的最大连续空格 , 竖直方向移除一些线后的最大连续空格 ) min(水平方向移除一些线后的最大连续空格, 竖直方向移除一些线后的最大连续空格)min(水平方向移除一些线后的最大连续空格,竖直方向移除一些线后的最大连续空格)即为方形的最大边长。

水平方向移除一些线后的最大连续空格数是多少呢?很简单,把所有能移除的都移除呗。具体来说:

使用一个变量l a s t lastlast记录当前空格向右处理到哪条线了,使用一个变量c n t cntcnt记录当前空格的连续长度。

遍历分隔线数组,如果当前能移除的分隔线正好等于l a s t + 1 last+1last+1,则空格可以继续网友拓展(更新c n t + 1 cnt+1cnt+1,更新l a s t + 1 last+1last+1);

否则,说明上个连续空格无法拓展到这条线,更新答案最大值,并将c n t cntcnt初始化为2 22(这条线可以移除,空格长度为2),更新last为当前这条线。

  • 时间复杂度O ( h log ⁡ h + v log ⁡ v ) O(h\log h+v\log v)O(hlogh+vlogv),其中h = l e n ( h B a r s ) h=len(hBars)h=len(hBars)v = l e n ( v B a r s ) v=len(vBars)v=len(vBars)
  • 空间复杂度O ( log ⁡ h + log ⁡ v ) O(\log h+\log v)O(logh+logv),时空复杂度的主要来源都是排序,因为题目没说给定分隔线有序。

AC代码

C++
/* * @LastEditTime: 2026-01-15 10:20:39 */classSolution{private:intgetMaxDiff(vector<int>&v){intlast=1,cnt=1,ans=1;for(intt:v){if(t==last+1){cnt++;last++;}else{ans=max(ans,cnt);cnt=2;last=t;}}ans=max(ans,cnt);returnans;}public:intmaximizeSquareHoleArea(intn,intm,vector<int>&hBars,vector<int>&vBars){sort(hBars.begin(),hBars.end());sort(vBars.begin(),vBars.end());intside=min(getMaxDiff(hBars),getMaxDiff(vBars));returnside*side;}inttestGetMaxDiff(vector<int>&v){returngetMaxDiff(v);}};

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/28 11:48:11

sudo reboot的庖丁解牛

sudo reboot 是 Linux 系统中 以超级用户权限触发系统重启 的命令。它看似简单&#xff0c;但背后涉及 权限模型、关机流程、系统安全 三大机制。一、命令拆解部分作用sudo临时提升权限&#xff08;以 root 身份执行&#xff09;reboot触发系统重启&#xff08;调用 systemctl …

作者头像 李华
网站建设 2026/8/21 14:32:24

C语言中switch case使用技巧,告别冗长if-else代码

在C语言中&#xff0c;switch case语句是一种高效的多分支选择结构&#xff0c;相比连续的if-else语句&#xff0c;它在处理多个确定值的情况时更加清晰和简洁。合理使用switch case不仅能提高代码可读性&#xff0c;还能在某些情况下优化程序性能。本文将深入探讨switch case的…

作者头像 李华
网站建设 2026/8/29 4:31:10

全网最全专科生AI论文写作软件TOP9测评

全网最全专科生AI论文写作软件TOP9测评 2026年专科生AI论文写作工具测评维度解析 随着人工智能技术的不断进步&#xff0c;越来越多的专科生开始借助AI写作工具提升论文写作效率。然而&#xff0c;面对市场上琳琅满目的选择&#xff0c;如何挑选真正适合自己需求的工具成为一大…

作者头像 李华
网站建设 2026/8/27 2:51:01

GraphRAG 落地:用 Neo4j 构建知识图谱,让 AI 读懂《红楼梦》的人物关系

标签: #GraphRAG #Neo4j #LLM #知识图谱 #人工智能 #Python 📉 前言:向量检索的局限性 传统的 RAG 流程是: 用户提问 -> 向量化 -> 检索相似文档块 -> 喂给 LLM 但在《红楼梦》这种场景下,如果你问 “贾兰应该叫贾宝玉什么?”: Vector RAG:可能会检索到“贾…

作者头像 李华
网站建设 2026/8/21 14:32:30

COOH-CH2-S-CH2-COOH,羧基-双硫醚-羧基,偶联药物与生物分子

COOH-CH2-S-CH2-COOH&#xff0c;羧基-双硫醚-羧基&#xff0c;偶联药物与生物分子一、COOH–CH₂–S–CH₂–COOH 的基本描述COOH–CH₂–S–CH₂–COOH 是一种以 硫醚桥链&#xff08;–S–&#xff09; 连接两端羧基的双功能化小分子&#xff0c;化学结构可以表示为&#xf…

作者头像 李华