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

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

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

给你一个网格图,由 n + 2 条 横线段 和 m + 2 条 竖线段 组成,一开始所有区域均为 1 x 1 的单元格。

所有线段的编号从 1 开始。

给你两个整数 n 和 m 。

同时给你两个整数数组 hBars 和 vBars 。

  • 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 last last记录当前空格向右处理到哪条线了,使用一个变量 c n t cnt cnt记录当前空格的连续长度。

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

否则,说明上个连续空格无法拓展到这条线,更新答案最大值,并将 c n t cnt cnt初始化为 2 2 2(这条线可以移除,空格长度为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){int last =1, cnt =1, ans =1;for(int t : v){if(t == last +1){ cnt++; last++;}else{ ans =max(ans, cnt); cnt =2; last = t;}} ans =max(ans, cnt);return ans;}public:intmaximizeSquareHoleArea(int n,int m, vector<int>& hBars, vector<int>& vBars){sort(hBars.begin(), hBars.end());sort(vBars.begin(), vBars.end());int side =min(getMaxDiff(hBars),getMaxDiff(vBars));return side * side;}inttestGetMaxDiff(vector<int>& v){returngetMaxDiff(v);}};
同步发文于ZEEKLOG和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

Read more

Flutter 三方库 fsrs 突破鸿蒙端智能认知交互模型的高频动态复习算法引擎适配:搭建复杂离线记忆曲线追踪体系全息掌握大脑突触留存衰退参数助力超效在线学习-适配鸿蒙 HarmonyOS ohos

Flutter 三方库 fsrs 突破鸿蒙端智能认知交互模型的高频动态复习算法引擎适配:搭建复杂离线记忆曲线追踪体系全息掌握大脑突触留存衰退参数助力超效在线学习-适配鸿蒙 HarmonyOS ohos

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 fsrs 突破鸿蒙端智能认知交互模型的高频动态复习算法引擎适配:搭建复杂离线记忆曲线追踪体系全息掌握大脑突触留存衰退参数助力超效在线学习 前言 在 OpenHarmony 智慧教育与个人效能类应用开发中,如何帮助用户高效记忆海量知识点(如单词、医学条目、法律条文)?如果仅仅采用简单的均匀复习,学习效率会由于大量重复已知内容而极其低下。fsrs(Free Spaced Repetition Scheduler)算法库为开发者提供了一套比传统的 Anki (SM-2) 更先进、基于 DSR 模型(Difficulty, Stability, Retrievability)的现代间隔重复调度算法。本文将实战介绍如何在鸿蒙端利用该算法构建一个顶级水平的学习大脑。 一、原直线性 / 概念介绍 1.1 基础原理/概念介绍 fsrs 的核心逻辑是基于 基于三个动态指标的三阶模型:难度 (Difficulty)、稳定性

By Ne0inhk
基于YOLO26/11/v8算法的Web目标检测系统,人脸表情识别系统,Django+Vue3 的前后端分离,实现摄像头实时识别,YOLO26/YOLO11/v8 + LLM大模型智能分析,科研必备

基于YOLO26/11/v8算法的Web目标检测系统,人脸表情识别系统,Django+Vue3 的前后端分离,实现摄像头实时识别,YOLO26/YOLO11/v8 + LLM大模型智能分析,科研必备

✨ 更新日志 * ✔️ 2026/3/3,2.0 版本,前端导航栏改为侧边栏系统,视频流采用websocket框架延迟更低, YOLO26/YOLO11/YOLOv8 视频流更稳定,在之前的系统增加 LLM 大模型智能分析,是科研必备,支持 YOLO26/11/v8 分类模型、目标检测、分割、obb、关键点检测任务,还支持双模型联合检测与识别,如人脸表情识别、人脸识别等一些识别任务需要检测模型与分类模型共同完成,在人脸表情识别中,单独使用检测模型去识别人脸表情也不是不可以,但有一个问题数据集如果全是头部照片的话,当模型预测的照片是全身照片时,模型识别准确率就没有这么高了, 那么这时候可以用检测模型识别人脸,把人脸信息输入到表情分类模型进行分类即可,反正这是一个通用的系统,更换自己模型即可,大家懂得都懂的,更多功能看下文即可。 摘要 在人工智能迈向通用化(AGI)的今天,“视觉感知 + 语言理解”的多模态联合是未来的趋势。单纯的检测画框已经无法满足复杂的业务需求,如何让系统“看懂”

By Ne0inhk
优选算法《前缀和》

优选算法《前缀和》

在之前的篇章当中我们已经了解了双指针、滑动窗口、二分查找算法,那么接下来在本篇当中我们将继续进行算法的学习,在本篇当中我们学习的算法是前缀和算法。在此会先了解前缀和算法是什么,之后再了解前缀和算法的适用场景,再依次了解一维前缀和和二维前缀和,最后再了解完算法原理之后,还是和之前一样通过题目解析、算法原理讲解、代码实现的三步来完成代码习题。一起加油吧!! 1.前缀和算法 在此要了解什么是前缀和就来通过以下的算法题来了解  1.1 一维前缀和  【模板】前缀和_牛客题霸_牛客网 题目解析  通过以上的题目描述就可以看出以上算法题要我们实现的是创建一个大小为n+1的数组,在此将数组大小创建为n+1是由于数组当中的元素是从下标1开始计数的。之后要进行的操作就是将数组当中指定下标区间内的元素之和。 键盘在输入的第一行第一个数值n+1就表示数组的大小,之后第一行的第二个数值q就表示要进行查找的次数。第二行的就表示要插入到数组当中的元素,之后每行的元素就表示表示要查询区间的边界。 例如以上的示例1,第一行输入为3 2,就表示数组的大小要为4,之后会进行三次的查询 算

By Ne0inhk
【算法】动态规划(路径/线性/背包/子数组子序列/回文串/两数组)

【算法】动态规划(路径/线性/背包/子数组子序列/回文串/两数组)

目录 使用动态规划解题的一般思路 处理边界问题和初始化的技巧 使用动态规划解决路径问题 简单多状态 dp 问题 子数组问题 子序列问题 回文串问题 两个数组的 dp 问题 背包问题 01背包模板 完全背包模板 二维费用的背包问题 使用动态规划解题的一般思路 1、确定状态表示(最重要的一步) 用一个一维数组或者二维数组充当 dp(dynamic programming) 表,想办法把 dp 表填满,表格的某个数据就是答案,要根据题目要求确定合适的 dp 表大小,确保最终答案在 dp 表内。把 dp 表的某个数据就当作状态表示(dp[i] 表示什么含义,粗略的理解)。状态表示通常有两个思考方向:1、dp[i] 表示 i 位置为结尾(

By Ne0inhk