shell判断两个变量是否相等_LeetCode基础算法题第122篇:如何判断两个正方形是否相交...

8f05dc6f0a75866d35ff6d0bd4460b54.png
技术提高是一个循序渐进的过程,所以我讲的leetcode算法题从最简单的level开始写的,然后> 到中级难度,最后到hard难度全部完。目前我选择C语言,Python和Java作为实现语言,因为这三种语言还是比较典型的。由于篇幅和> 精力有限,其他语言的实现有兴趣的朋友请自己尝试。初级难度说的差不多的时候,我打算再加点其他内容,我可能会从操作系统到协议栈,从分布式> 聊到大数据框架,从大数据聊到人工智能,... ...。 如果有任何问题可以在文章后评论或者私信给我。 我会持续分享下去,敬请您的关注。

LeetCode 836. 矩形重叠(Rectangle Overlap)

问题描述:

矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标。如果相交的面积为正,则称两矩形重叠。需要明确的是,只在角或边接触的两个矩形不构成重叠。给出两个矩形,判断它们是否重叠并返回结果。

注:

  1. 两个矩形 rec1 和 rec2 都以含有四个整数的列表的形式给出。
  2. 矩形中的所有坐标都处于 -10^9 和 10^9 之间。

示例:

d595d74674c668f8acbeca1b7019f4a7.png

C语言实现:

解题的关键是找到如何确定两个正方形相交。

两个正方形相交有很多形式,我们看下面两种典型的形式:

849861388ad928368cf7aa3bf3310b17.png

先看左图,蓝色和绿色的正方形相交。注意观察它们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

如下代码如下:

18df7fa8ef9cd46a39830e67fbf3a37e.png

注意x坐标和y坐标在rec1和rec2中的位置和顺序。

对于C和JAVA要考虑数值溢出的问题,所以要对以上的表达式做强制类型转换。

d8731e165248f673a684643c1cb8b78d.png

Java语言实现:

Java 的实现和C语言的实现一致,不再撰述。代码如下:

a5e7caa3e2a59c4cd753c576048981a0.png
810fb3cf9bcbbddd5b8b6fd08cfe23ba.png

Python语言实现:

Python 的实现和C语言的实现一致,不再撰述。代码如下:

4bb29f90465760a5a89dd86673ca3ad7.png
a5bf33f3c5d7e8f15edba953943696dd.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值