leetcode 836 矩形重叠(Java/C++

矩形重叠(Java

题目描述

矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标。

如果相交的面积为正,则称两矩形重叠。需要明确的是,只在角或边接触的两个矩形不构成重叠。

给出两个矩形,判断它们是否重叠并返回结果。

示例 1:

输入:rec1 = [0,0,2,2], rec2 = [1,1,3,3]
输出:true

示例 2:

输入:rec1 = [0,0,1,1], rec2 = [1,0,2,1]
输出:false

题目分析

思路一(复杂 Java实现):
判断一个点在不在矩形里很容易实现:点的x坐标在x1,x2之间,y坐标在y1,y2之间
1.重叠可能有一个矩形的顶点在另一个矩形里
判断两组八个点(判断四个也行,特殊情况留给下一个判断)
2.但是可能两个一般大(日字形/或者一个7)
反正就可以用四个边的中点去判断!逃不掉的中点判断!
判断八次,一定有一个边的中点在另一个矩形里。
over
思路二 (简单 C++实现)
去除两个矩形不相交的情况 剩下的情况都为相交
不相交的情况有四种:
矩形A下边界大于矩形B上边界
矩形A上边界小于矩形B下边界
矩形A左边界大于矩形B右边界
矩形A右边界小于矩形B左边界
因边界接触不表示覆盖,又要去掉边界接触的情况
所以以上几种情况再加上相等
这些情况返回false 剩下的返回true

代码

Java:
class Solution {
    public boolean isRectangleOverlap(int[] rec1, int[] rec2) {
        //判断四个顶点
        if(isin(rec1[0],rec1[1],rec2)) return true;
        if(isin(rec1[2],rec1[3],rec2)) return true;
        if(isin(rec1[0],rec1[3],rec2)) return true;//另外两个顶点
        if(isin(rec1[1],rec1[2],rec2)) return true;
        //判断四个中点
        int[][] recmiddle1 = {{(rec1[0]+rec1[2])/2,rec1[1]},{(rec1[0]+rec1[2])/2,rec1[3]},{rec1[0],(rec1[1]+rec1[3])/2},{rec1[2],(rec1[1]+rec1[3])/2}};
        int[][] recmiddle2 = {{(rec2[0]+rec2[2])/2,rec2[1]},{(rec2[0]+rec2[2])/2,rec2[3]},{rec2[0],(rec2[1]+rec2[3])/2},{rec2[2],(rec2[1]+rec2[3])/2}};
        int i = 0;
        while(i<4)
        {
           if(isin(recmiddle1[i][0],recmiddle1[i][1],rec2)) return true;
           ++i;
        }
        i = 0;
        while(i<4)
        {
           if(isin(recmiddle2[i][0],recmiddle2[i][1],rec1)) return true;
           ++i;
        }
        return false;
    }
    //判断一个点在不在一个矩形里
    public boolean isin(int x ,int y, int[] rec)
    {
        if(x>rec[0]&&x<rec[2]&&y>rec[1]&&y<rec[3])
            return true;
        else
            return false;
    }
}
C++:(男朋友写的
class Solution {
public:
    bool isRectangleOverlap(vector<int>& rec1, vector<int>& rec2) {
        if(rec1[0] >= rec2[2] || rec1[2] <= rec2[0] || rec1[1] >= rec2[3] || rec1[3] <= rec2[1])
            return false;
        else
            return true;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值