zoukankan      html  css  js  c++  java
  • LeetCode-223 Rectangle Area

    题目描述

    Find the total area covered by two rectilinear rectangles in a 2D plane.

    Each rectangle is defined by its bottom left corner and top right corner as shown in the figure.

    Rectangle Area

    题目大意

    求两个矩形占的面积的和(重叠部分不能重复计算)。

    示例

    E1

    Input: A = -3, B = 0, C = 3, D = 4, E = 0, F = -1, G = 9, H = 2
    Output: 45

    解题思路

    被LeetCode@rich巧妙的算法惊到了,之前还苦苦的ifelse与这行代码一比真是愚蠢之极(╯°Д°)╯︵ ┻━┻ 。

    该算法主要思路是若两个矩形出现重叠,只需得知重叠部分矩形的两个顶点坐标即可,无需判断是哪个矩形的哪个顶点,将所有顶点排序之后取中间的两个顶点后就是重叠部分的矩形顶点坐标。

    复杂度分析

    时间复杂度:O(1)

    空间复杂度:O(1)

    代码

    class Solution {
    public:
        int computeArea(int A, int B, int C, int D, int E, int F, int G, int H) {
            // 避免出现越界现象将结果设为long long
            long long res = (long long)(C - A) * (long long)(D - B) + (long long)(G - E) * (long long)(H - F);
            // 若矩形之间无重叠部分直接返回两矩形面积之和
            if(C <= E || A >= G || D <= F || B >= H)
                return res;
            // 将四个顶点按从小到大的顺序排序,排序后的中间两个位置就是重叠部分的坐标, 
            // 可根据上面图片进行分析理解
            vector<int> h;
            vector<int> v;
            h.push_back(A);
            h.push_back(C);
            h.push_back(E);
            h.push_back(G);
            
            v.push_back(B);
            v.push_back(D);
            v.push_back(F);
            v.push_back(H);
            
            sort(h.begin(), h.end());
            sort(v.begin(), v.end());
            
            return res - (h[2] - h[1]) * (v[2] - v[1]);
        }
    };
  • 相关阅读:
    4.C#的选择语句练习
    3.C#中的选择语句
    java包静态导入,继承
    新的学期要继续学习喽
    桌球小游戏
    JAVA和C语言的区别
    BIV+CSS网页的标准化布局
    层叠样式表
    学PHP也要懂得HTML
    web开发入门
  • 原文地址:https://www.cnblogs.com/heyn1/p/11077879.html
Copyright © 2011-2022 走看看