🎈 算法并不一定都是很难的题目,也有很多只是一些代码技巧,多进行一些算法题目的练习,可以帮助我们开阔解题思路,提升我们的逻辑思维能力,也可以将一些算法思维结合到业务代码的编写思考中。简而言之,平时进行的算法习题练习带给我们的好处一定是不少的,所以让我们一起来养成算法练习的习惯。今天练习的题目是一道比较简单的题目 ->圆和矩形是否有重叠
问题描述
给你一个以 (radius, xCenter, yCenter)
表示的圆和一个与坐标轴平行的矩形 (x1, y1, x2, y2)
,其中 (x1, y1)
是矩形左下角的坐标,而 (x2, y2)
是右上角的坐标。
如果圆和矩形有重叠的部分,请你返回 true
,否则返回 false
。
换句话说,请你检测是否 存在 点 (xi, yi)
,它既在圆上也在矩形上(两者都包括点落在边界上的情况)。
示例 1 :
输入: radius = 1, xCenter = 0, yCenter = 0, x1 = 1, y1 = -1, x2 = 3, y2 = 1 输出: true 解释: 圆和矩形存在公共点 (1,0) 。
示例 2 :
输入: radius = 1, xCenter = 1, yCenter = 1, x1 = 1, y1 = -3, x2 = 2, y2 = -1 输出: false
示例 3 :
输入: radius = 1, xCenter = 0, yCenter = 0, x1 = -1, y1 = 0, x2 = 0, y2 = 1 输出: true
提示:
1 <= radius <= 2000
-10^4 <= xCenter, yCenter <= 10^4
-10^4 <= x1 < x2 <= 10^4
-10^4 <= y1 < y2 <= 10^4
思路分析
首先我们应该要先理解一下题目意思,题目会给我们一个圆形和一个矩形的相关信息,我们需要判断给出的矩形和圆形是否会有重叠的部分,首先我们先分析一下矩形和圆形可能存在的位置情况:
- 1、包含关系
矩形包含圆形或者圆形包含矩形,如下图:
- 2、相切
内切的时候也是包含关系,所以这里只看外切的情况,如下图:
- 3、相交
矩形和圆形有重叠部分,如下图:
- 4、相离
矩形和圆形没有重叠部分,如下图:
我们再分析一下上面得出的4种情况,因为题目中说到包括点落在边界上的情况,所以相切时候的切点也算作是重叠的部分,也就是说1、2、3这三种情况都是满足题目条件的,这几种情况我们都可以通过圆心到矩形边上的距离来区分。
- 圆心位于矩形的四边之间
x1 < xCenter < x2 && y1 < yCenter < y2
,这时候肯定是包含关系或者相交关系,即一定符合题目要求,两个图形有重叠的部分。
- 圆心位于矩形的四边之外
这时候圆形和矩形可能存在两种位置关系:相交或相离。我们可以通过计算圆心到矩形边上的距离来区分这两种位置情况:
如果圆心到矩形边上距离大于等于半径时,说明两个图形是相离的;
如果圆心到矩形边上的距离小于半径时,说明两个图形是相交的;
AC 代码
完整 AC 代码如下:
/** * @param {number} radius * @param {number} xCenter * @param {number} yCenter * @param {number} x1 * @param {number} y1 * @param {number} x2 * @param {number} y2 * @return {boolean} */ var checkOverlap = function (radius, xCenter, yCenter, x1, y1, x2, y2) { let dist = 0; if (xCenter < x1 || xCenter > x2) { dist += Math.min(Math.pow(x1 - xCenter, 2), Math.pow(x2 - xCenter, 2)); } if (yCenter < y1 || yCenter > y2) { dist += Math.min(Math.pow(y1 - yCenter, 2), Math.pow(y2 - yCenter, 2)); } return dist <= radius ** 2; };
说在后面
🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,在此谢谢大家的支持,我们下文再见 🙌。