Leetcode 223 Rectangle Area 矩形区域面积

原创 2015年08月28日 17:51:41

原题地址

https://leetcode.com/problems/rectangle-area/

题目描述

Find the total area covered by two rectilinear rectangles in a 2D plane.
计算两个矩形所在2D空间内覆盖的区域面积。

Each rectangle is defined by its bottom left corner and top right corner as shown in the figure.
每个矩形在图中由其左下角的顶点和右上角的顶点来定义。如下图:
这里写图片描述

Assume that the total area is never beyond the maximum possible value of int.
假设计算结果不超过int的最大值。

解题思路

解题思路还是很简单的,先分别计算两个矩形的面积并求和,然后减去矩形重合部分的面积即可,因为重合部分被计算了两次。对于计算单个矩形的面积非常简单 dx * dy,剩下的问题就是求重合部分的面积了。

如何判断两个矩形有重合?如何计算重合部分面积?

1. 判定重合

对于以下四种情况,肯定无重合:
这里写图片描述

  • (1)如果矩形A的右上顶点的横坐标小于矩形B的左下角的横坐标
  • (2)如果矩形A的左下顶点的横坐标大于矩形B的右上角下角的横坐标
  • (3)如果矩形A的左下顶点的纵坐标大于矩形B的右上角的纵坐标
  • (4)如果矩形A的右上顶点的纵坐标小于矩形B的左下角的纵坐标

判定无重合的方法非常简单,无重合时直接返回重合部分面积为0。

2. 有重合时求重合部分面积

有重合时,大概如下:
这里写图片描述

简单描述就是:在两个矩形的四个顶点中,分别把横纵坐标排序,然后分别取横纵坐标的中间两个数,其构成的矩形区域就是重合区域

有了如上两步,这个问题的解决就比较轻松了。

代码

/**
 * 计算两个矩形覆盖的总面积
 */
int computeArea(int A, int B, int C, int D, int E, int F, int G, int H) {
    return (D - B) * (C - A) + (H - F) * (G - E) -
            computeRetainArea(A, B, C, D, E, F, G, H);
}

/**
 * 计算两个矩形重合区域面积
 */
int computeRetainArea(int A, int B, int C, int D, int E, int F, int G, int H) {
    void sort(int*, int, int);
    if (E >= C || G <= A || H <= B || F >= D) return 0; // 不重合
    int nums[4];
    // 计算x坐标重合区域差值
    nums[0] = A;
    nums[1] = C;
    nums[2] = E;
    nums[3] = G;
    sort(nums, 0, 3);
    int diffX = nums[1] - nums[2];
    // 计算y坐标重合区域差值
    nums[0] = B;
    nums[1] = D;
    nums[2] = F;
    nums[3] = H;
    sort(nums, 0, 3);
    int diffY = nums[1] - nums[2];

    int ans = diffX * diffY;
    return ans < 0 ? -ans : ans;
}

完整代码 https://github.com/Orange1991/leetcode/blob/master/223/c/main.c

测试数据

-3,0,3,4,0,-1,9,2 : 45
-2,-2,2,2,-2,-2,2,2 : 16
0,0,0,0,-1,-1,1,1 : 4

2015/8/28

版权声明:本文为博主原创文章,未经博主允许不得转载。

223. Rectangle Area

1、题目描述 输入八个整数,每四个数用来表示一个矩形,返回两个矩形的并集的面积。 2、思路 分别求出两个矩形面积,再求出重叠部分面积,将它减掉。 3、代码 int computeAre...
  • zibingling777
  • zibingling777
  • 2017年12月23日 22:05
  • 9

LeetCode 223 Rectangle Area(矩形面积)

翻译找到在二维平面中两个相交矩形的总面积。每个矩形都定义了其左下角和右上角的坐标。(矩形如下图)假设,总占地面积永远不会超过int的最大值。原文分析这题前天试过,写了一堆判断,终究还是无果……贴几个别...
  • NoMasp
  • NoMasp
  • 2016年01月27日 12:17
  • 2546

HDU-1264 Counting Squares 矩形面积并 线段树+扫描线

题意:      给任意个矩形求矩形的并集   交集算的面积为覆盖一次或一次以上的面积 并集为覆盖两次或两次以上的面积 代码就多个求覆盖两次或两次的函数 可以参考矩形面积交 http:...
  • u011742541
  • u011742541
  • 2013年10月28日 18:42
  • 623

Leetcode 223 Rectangle Area 矩形区域面积

计算两个矩形所在2D空间内覆盖的区域面积。
  • smile_watermelon
  • smile_watermelon
  • 2015年08月28日 17:51
  • 420

Leetcode_223_Rectangle Area

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/46868363 Find the total area...
  • pistolove
  • pistolove
  • 2015年07月13日 22:02
  • 988

【LeetCode-面试算法经典-Java实现】【223-Rectangle Area(矩形区域)】

【223-Rectangle Area(矩形区域)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】代码下载【https://github.com/Wang-Jun-Chao】原题...
  • DERRANTCM
  • DERRANTCM
  • 2015年08月29日 06:39
  • 2712

ZZULIOJ 1816: 矩形 【矩形重叠面积的计算(区分相离与相交)】

1816: 矩形 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 103  Solved: 32 SubmitStatusWeb Boar...
  • dxx_111
  • dxx_111
  • 2015年12月10日 21:11
  • 1303

根据四个点坐标求两个直线的交叉点坐标

过程如下:   假设两个直线的方程为如下表示。    T=K*S+B--------------------(1)    T=MS+D---------------------(2)      点G...
  • fu_shuwu
  • fu_shuwu
  • 2017年10月28日 16:15
  • 391

LeetCode(223)_Rectangle Area

Find the total area covered by two rectilinear rectangles in a 2D plane. Each rectangle is defined ...
  • u011290316
  • u011290316
  • 2016年10月28日 16:35
  • 94

[leetcode 223] Rectangle Area

Question: Find the total area covered by two rectilinear rectangles in a 2D plane. Each rectan...
  • Xiaohei00000
  • Xiaohei00000
  • 2015年11月19日 12:33
  • 291
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Leetcode 223 Rectangle Area 矩形区域面积
举报原因:
原因补充:

(最多只允许输入30个字)