技术提高是一个循序渐进的过程,所以我讲的leetcode算法题从最简单的level开始写的,然后> 到中级难度,最后到hard难度全部完。目前我选择C语言,Python和Java作为实现语言,因为这三种语言还是比较典型的。由于篇幅和> 精力有限,其他语言的实现有兴趣的朋友请自己尝试。初级难度说的差不多的时候,我打算再加点其他内容,我可能会从操作系统到协议栈,从分布式> 聊到大数据框架,从大数据聊到人工智能,... ...。 如果有任何问题可以在文章后评论或者私信给我。 我会持续分享下去,敬请您的关注。
LeetCode 836. 矩形重叠(Rectangle Overlap)
问题描述:
矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标。如果相交的面积为正,则称两矩形重叠。需要明确的是,只在角或边接触的两个矩形不构成重叠。给出两个矩形,判断它们是否重叠并返回结果。
注:
- 两个矩形 rec1 和 rec2 都以含有四个整数的列表的形式给出。
- 矩形中的所有坐标都处于 -10^9 和 10^9 之间。
示例:
C语言实现:
解题的关键是找到如何确定两个正方形相交。
两个正方形相交有很多形式,我们看下面两种典型的形式:
先看左图,蓝色和绿色的正方形相交。注意观察它们x坐标的情况,会得出:
x4-x1 < (x4-x3) + (x2-x1)
如果y坐标也满足:y1+y4 < (y4-y3) + (y2-y1) 将会出现左图这样的相交形式。
再看右图的x坐标,这个时候:
x2-x3 < (x4-x3) + (x2-x1)
而y坐标依然是:y1-y4 < (y4-y3) + (y2-y1)
我们会发现如果用这种方法来解题,我们需要考虑所有相交的情形,然后一一作出判断。
这种方法有些麻烦。有没有一种方法只需要少量的判断的方法。答案是有的。
依然从左图说起。
我们假设蓝色正方形是固定不动的,而绿色正方形从右边远处向蓝色正方形移动。
- 那么在最开始的时候两个正方形是不相交的,也就是说存在:x1 < x2 < x3 < x4 从而可以得出 (x4-x1)*(x3-x2) > 0;
- 而当移动到两个正方形相交的时候,存在:x1 < x3 < x2 < x4 这个时候 (x4-x1)*(x3-x2) < 0;
- 如果绿色正方形继续向左移动,最后出现在蓝色正方形的左边,且还与蓝色正方形相交时,就是右图的形式,则存在:x3 < x1 < x4 < x2 这个时候 (x4-x1)*(x3-x2) < 0;
- 如果继续移动,两个正方形不再相交,则存在:x3 < x4 < x1 < x2 这个时候 (x4-x1)*(x3-x2) > 0;
也就是说,如果两个正方形相交,则存在 (x4-x1)*(x3-x2) < 0
同理你可以对y坐标做类似的分析,可以得出,如果两个正方形相交,则存在 (y4-y1)*(y3-y2) < 0
所以我们可以用下面表达式的值来判断两个正方形是否相交:
(x4-x1)*(x3-x2) < 0 且 (y4-y1)*(y3-y2) < 0
如下代码如下:
注意x坐标和y坐标在rec1和rec2中的位置和顺序。
对于C和JAVA要考虑数值溢出的问题,所以要对以上的表达式做强制类型转换。
Java语言实现:
Java 的实现和C语言的实现一致,不再撰述。代码如下:
Python语言实现:
Python 的实现和C语言的实现一致,不再撰述。代码如下: