Leetcode 223 Rectangle Area

题目:
这里写图片描述
题目的意思大概就是给你四个坐标,来表示两个矩形。然后计算两个矩形的面积,这里都是假设两个矩形都是水平的。
解题思路: 这个问题其实可以分成一个更小的问题,就是给你一个数轴上两条线段(四个点设线段L1(x1,x2), 线段L2(y1,y2)),要你求解他们重合的长度。他们在数轴上的分布情况可以分为以下三种情况。
1、两个线段没有相交的情况,即y2≤x1或者y1≥x2
2、某条线段在另外一条线段的内部,即(y1≥x1&&y2≤x2)||(x1≥y1&&x2≤y2)
3、两条线段部分相交,即(y1≤x1&&y2≥x1&&y2≤x2)||(y1≥x1&&y1≤x2&&y2≥x2)

根据这样的两种情况,就可以把重合部分矩形的长和宽计算出来。就可以做出来了,代码如下。

    int dealt(int x1,int x2,int y1,int y2)
    {
        if(y1>=x2||y2<=x1)
            return 0;
        if(x1<=y1&&y2<=x2)
            return y2-y1;
        if(y1<=x1&&x2<=y2)
            return x2-x1;
        if(y1<=x1&&y2>=x1&&y2<=x2)
            return y2-x1;
        if(y1>=x1&&y1<=x2&&y2>=x2)
            return x2-y1;

    }
    int computeArea(int A, int B, int C, int D, int E, int F, int G, int H)
    {
        return (C-A)*(D-B)+(G-E)*(H-F)-dealt(A,C,E,G)*dealt(B,D,F,H);
    }

在求解这种重合的情况,当线段相对比较多的时候,就不应该使用这种分类讨论的情况,先对其排序再求解,具体可以参考soj上的“校园里的树”一题。这里也可以使用排序的方法,代码如下。

    int computeArea(int A, int B, int C, int D, int E, int F, int G, int H)
    {
        int ans=(D-B)*(C-A)+(G-E)*(H-F);
       if(E>=C||G<=A||F>=D||H<=B)
        return ans;
       else
       {
           vector<int> x;
           x.push_back(A);
           x.push_back(C);
           x.push_back(E);
           x.push_back(G);
           vector<int> y;
           y.push_back(B);
           y.push_back(D);
           y.push_back(F);
           y.push_back(H);
           sort(x.begin(),x.end());
           sort(y.begin(),y.end());
           return ans-((x[2]-x[1])*(y[2]-y[1]));
       }
       return ans;
    }

总结: 虽然说排序是一种更为科学的方法,但是在这里它只有两条线段,使用排序还要开两个vector还要排序,那空间和时间复杂度是不是相对而言比较高一点?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值