Leetcode Index

836.Rectangle Overlap

836.Rectangle Overlap

难度:Easy

A rectangle is represented as a list [x1, y1, x2, y2], where (x1, y1) are the coordinates of its bottom-left corner, and (x2, y2) are the coordinates of its top-right corner.

Two rectangles overlap if the area of their intersection is positive. To be clear, two rectangles that only touch at the corner or edges do not overlap.

Given two (axis-aligned) rectangles, return whether they overlap.

Example 1:
Input: rec1 = [0,0,2,2], rec2 = [1,1,3,3]
Output: true
Example 2:
Input: rec1 = [0,0,1,1], rec2 = [1,0,2,1]
Output: false
Notes:
Both rectangles rec1 and rec2 are lists of 4 integers.
All coordinates in rectangles will be between -10^9 and 10^9.

这里可以利用计算几何里的ToLeft测试,即判断一个点是否在一条线段的左边,主要是利用海伦公式,线段为有向线段。 对于不重叠的两个矩形,肯定对矩形的某一条边,四个顶点都在该条边的外侧,设矩形方向为逆时针,则四个点都在某一条边的右侧,则表示无重叠。

class Solution {
//To Left Test; line: px, py, qx,qy;point: sx,sy;
//p.x * q.y - p.y* q.x + q.x * s.y - q.y * s.x + s.x * p.y - s.y * p.x;
bool toLeft(vector<int>rec1,int px, int py,int qx, int qy)
{
vector<long int> tmp(4,0);
int start=0;
for(int i=0;i<3;i+=2)
for(int j=1;j<4;j+=2)
{
int sx=rec1[i];
int sy=rec1[j];
tmp[start++] = (long)px*qy-(long)py*qx +(long)qx*sy -(long)qy*sx + (long)sx*py -(long)sy *px ;
}
// cout<< px <<" "<<py<<" "<<qx<<" "<<qy<<endl;
// cout<<tmp[0] <<" "<< tmp[1] <<" "<<tmp[2] <<" "<< tmp[3]<<endl;
if( tmp[0]<=0 && tmp[1]<=0 && tmp[2]<=0 && tmp[3]<=0) return true;
return false;
}
public:
bool isRectangleOverlap(vector<int>& rec1, vector<int>& rec2) {
return !(toLeft(rec1,rec2[0],rec2[1],rec2[2],rec2[1]) || toLeft(rec1,rec2[2],rec2[1],rec2[2],rec2[3]) || toLeft(rec1,rec2[2],rec2[3],rec2[0],rec2[3] ) || toLeft(rec1,rec2[0],rec2[3],rec2[0],rec2[1]));
}
};

执行用时 :4 ms, 在所有 C++ 提交中击败了75.38%的用户 内存消耗 :8.1 MB, 在所有 C++ 提交中击败了92.54%的用户

另一种方法,分别考虑x坐标和y坐标,如果有重叠,则两个矩形的x坐标的最大值与最小值的差应该小于两条矩形的x方向的边长之和。y轴同理。

class Solution {
public:
bool isRectangleOverlap(vector<int>& rec1, vector<int>& rec2) {
return (long)max(rec2[2],rec1[2])-min(rec2[0],rec1[0]) < (long)rec2[2]-rec2[0]+ rec1[2]-rec1[0] && (long)max(rec2[3],rec1[3])-min(rec2[1],rec1[1]) < (long)rec2[3]-rec2[1]+rec1[3]-rec1[1] ;
}
};

执行用时 :4 ms, 在所有 C++ 提交中击败了75.38%的用户 内存消耗 :8.1 MB, 在所有 C++ 提交中击败了91.04%的用户