[LeetCode 391] Perfect Rectangle

本文深入探讨了如何判断多个轴对齐的矩形是否能够完全覆盖一个更大的矩形区域的问题。通过分析顶点出现次数和总面积计算,提供了一种有效的解决方案,并附带C++代码实现,展示了算法的运行效率。

Given N axis-aligned rectangles where N > 0, determine if they all together form an exact cover of a rectangular region.

Each rectangle is represented as a bottom-left point and a top-right point. For example, a unit square is represented as [1,1,2,2]. (coordinate of bottom-left point is (1, 1) and top-right point is (2, 2)).

Example 1:

rectangles = [
  [1,1,3,3],
  [3,1,4,2],
  [3,2,4,4],
  [1,3,2,4],
  [2,3,3,4]
]

Return true. All 5 rectangles together form an exact cover of a rectangular region.

分析 
这一题还是很有难度的,如果不知道巧妙的解法的话,估计很难写出来答案。我反正也是想了半天没想出比较合适的解,最后还是看了别人的思路。

对于长方形的拼接,最终形成一个大的长方形,必然要求最后只剩下四个顶点,这四个顶点必然只能出现一次。在拼接的过程中顶点如果出现重合,那么也必然能断定重合的顶点出现了2次或4次,如果出现3次,那么这个顶点一定只能拼成270度,不可能成为一个长方形。

所以使用set记录只出现1次的顶点,当set出现重复时就erase掉,如果没有就insert,最终要求只能剩下4个顶点。

如果最终剩下4个顶点也不能证明是长方形,因为有可能会有下述情况。

那么也就要求最后剩余的四个点组成组成的矩形的面积也必须等于各个组成的矩形面积之和。

Code

class Solution {
public:
    bool isRectangleCover(vector<vector<int>>& rectangles) {
        int length = rectangles.size();
        int area = 0;
        set<pair<int, int>> s;
        for (int i = 0; i < length; i ++)
        {
            vector<pair<int, int>> node;
            node.push_back(make_pair(rectangles[i][0], rectangles[i][1]));
            node.push_back(make_pair(rectangles[i][0], rectangles[i][3]));
            node.push_back(make_pair(rectangles[i][2], rectangles[i][3]));
            node.push_back(make_pair(rectangles[i][2], rectangles[i][1]));
            for (int j = 0; j <4; j ++)
            {
                if (s.find(node[j]) != s.end())
                {
                    s.erase(node[j]);
                }
                else
                {
                    s.insert(node[j]);
                }
            }
            area += (rectangles[i][2] - rectangles[i][0]) * 
                (rectangles[i][3] - rectangles[i][1]);
        }
        
        if (s.size() != 4)
            return false;
        int x1 = INT_MAX;
        int x2 = INT_MIN;
        int y1 = INT_MAX;
        int y2 = INT_MIN;
        set<pair<int, int>>::iterator iter;
        for (iter = s.begin(); iter != s.end(); iter ++)
        {
            if (iter->first < x1)
                x1 = iter->first;
            if (iter->first > x2)
                x2 = iter->first;
            if (iter->second < y1)
                y1 = iter->second;
            if (iter->second > y2)
                y2 = iter->second;
        }
        
        int rect = (y2 - y1) * (x2 - x1);
        if (rect != area)
            return false;
        return true;
    }
};

运行效率

Runtime: 176 ms, faster than 54.68% of C++ online submissions for Perfect Rectangle.

Memory Usage: 32.7 MB, less than 29.03% of C++ online submissions forPerfect Rectangle.

内容概要:本文围绕基于Matlab实现的面向光储充一体化社区的有序充电策略展开研究,旨在通过构建优化模型协调光伏发电、储能系统与电动汽车充电负荷之间的能量流动关系,解决综合能源系统中的充电调度问题。研究重点在于实现削峰填谷、降低用户用电成本、提升新能源就地消纳能力等多重目标。通过建立合理的数学优化模型,设定目标函数与约束条件,并借助Matlab工具完成求解与仿真分析,系统展示了如何将复杂的实际工程问题转化为可计算的优化问题,进而为社区级能源管理提供科学决策支持。代码实现部分详尽呈现了系统建模流程与算法求解细节,有助于读者深入理解有序充电策略的技术内涵与实现路径。; 适合人群:具备一定电力系统基础知识、优化理论背景及Matlab编程能力的研究生、科研人员及相关领域工程师,特别适用于从事综合能源系统、电动汽车调度、智能电网、微电网运行等方向的研究与开发人员。; 使用场景及目标:①学习光储充一体化系统的协同运行机制与能量管理策略;②掌握基于Matlab的优化建模方法与求解技术;③复现并改进有序充电调度算法,服务于学术论文撰写或实际工程项目开发;④为后续开展微电网优化调度、需求响应、分布式能源协调控制等相关课题奠定技术基础。; 阅读建议:建议结合Matlab代码逐行分析模型构建逻辑,重点关注目标函数的设计思路与各类物理、运行约束的数学表达方式,尝试调整负荷参数、新能源出力曲线或引入不同优化算法以观察策略敏感性,从而深刻把握有序充电策略的核心原理与应用潜力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值