LeetCode 2975.移除栅栏得到的正方形田地的最大面积:暴力枚举所有可能宽度

【LetMeFly】2975.移除栅栏得到的正方形田地的最大面积:暴力枚举所有可能宽度

力扣题目链接:https://leetcode.cn/problems/maximum-square-area-by-removing-fences-from-a-field/

有一个大型的 (m - 1) x (n - 1) 矩形田地,其两个对角分别是 (1, 1)(m, n) ,田地内部有一些水平栅栏和垂直栅栏,分别由数组 hFencesvFences 给出。

水平栅栏为坐标 (hFences[i], 1)(hFences[i], n),垂直栅栏为坐标 (1, vFences[i])(m, vFences[i])

返回通过移除 一些栅栏(可能不移除 )所能形成的最大面积的正方形 田地的面积,或者如果无法形成正方形田地则返回 -1

由于答案可能很大,所以请返回结果对 109 + 7 取余 后的值。

注意: 田地外围两个水平栅栏(坐标 (1, 1)(1, n) 和坐标 (m, 1)(m, n) )以及两个垂直栅栏(坐标 (1, 1)(m, 1) 和坐标 (1, n)(m, n) )所包围。这些栅栏不能 被移除。

示例 1:

复制代码
输入:m = 4, n = 3, hFences = [2,3], vFences = [2]
输出:4
解释:移除位于 2 的水平栅栏和位于 2 的垂直栅栏将得到一个面积为 4 的正方形田地。

示例 2:

复制代码
输入:m = 6, n = 7, hFences = [2], vFences = [4]
输出:-1
解释:可以证明无法通过移除栅栏形成正方形田地。

提示:

  • 3 <= m, n <= 109
  • 1 <= hFences.length, vFences.length <= 600
  • 1 < hFences[i] < m
  • 1 < vFences[i] < n
  • hFencesvFences 中的元素是唯一的。

解题方法:暴力枚举

水平竖直单看一个方向,可能的边长有哪些?

任意两个栅栏之间的距离都可以是边长,可以二重循环栅栏位置并将其放入哈希表中。

水平竖直一块看,如果一个边长在水平方向有可能得到,在竖直方向也有可能得到,那么就有办法得到这个长度为边长的正方形。

也就是两个哈希表求个交并取最大就好了。

  • 时间复杂度 O ( ( l e n ( h F e n c e s ) + l e n ( v F e n c e s ) ) 2 ) O((len(hFences) + len(vFences))^2) O((len(hFences)+len(vFences))2),这是因为 ( a + b ) 2 = a 2 + b 2 + 2 a b (a+b)^2=a^2+b^2+2ab (a+b)2=a2+b2+2ab,复杂度中等于 a 2 + b 2 + a b a^2+b^2+ab a2+b2+ab
  • 空间复杂度 O ( l e n ( h F e n c e s ) + l e n ( v F e n c e s ) ) O(len(hFences) + len(vFences)) O(len(hFences)+len(vFences))

AC代码

C++
cpp 复制代码
/*
 * @LastEditTime: 2026-01-17 21:08:43
 */
class Solution {
private:
    unordered_set<int> get(int n, vector<int>& v) {
        v.push_back(1);
        v.push_back(n);
        unordered_set<int> ans;
        for (int i = 0; i < v.size(); i++) {
            for (int j = i + 1; j < v.size(); j++) {
                ans.insert(abs(v[i] - v[j]));
            }
        }
        return ans;
    }
public:
    int maximizeSquareArea(int m, int n, vector<int>& hFences, vector<int>& vFences) {
        unordered_set<int> va = get(m, hFences), vb = get(n, vFences);
        int side = 0;
        for (int a : va) {
            if (vb.count(a)) {
                side = max(side, a);
            }
        }
        return side ? (long long) side * side % 1000000007 : -1;
    }
};

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

千篇源码题解已开源

相关推荐
无极低码14 小时前
ecGlypher新手安装分步指南(标准化流程)
人工智能·算法·自然语言处理·大模型·rag
软件算法开发15 小时前
基于海象优化算法的LSTM网络模型(WOA-LSTM)的一维时间序列预测matlab仿真
算法·matlab·lstm·一维时间序列预测·woa-lstm·海象优化
superior tigre15 小时前
22 括号生成
算法·深度优先
努力也学不会java17 小时前
【缓存算法】一篇文章带你彻底搞懂面试高频题LRU/LFU
java·数据结构·人工智能·算法·缓存·面试
旖-旎17 小时前
二分查找(x的平方根)(4)
c++·算法·二分查找·力扣·双指针
ECT-OS-JiuHuaShan17 小时前
朱梁万有递归元定理,重构《易经》
算法·重构
智者知已应修善业18 小时前
【51单片机独立按键控制数码管移动反向,2片74CH573/74CH273段和位,按键按下保持原状态】2023-3-25
经验分享·笔记·单片机·嵌入式硬件·算法·51单片机
khddvbe18 小时前
C++并发编程中的死锁避免
开发语言·c++·算法
C羊驼18 小时前
C语言:两天打鱼,三天晒网
c语言·经验分享·笔记·算法·青少年编程
菜菜小狗的学习笔记18 小时前
剑指Offer算法题(四)链表
数据结构·算法·链表