leetcode 836矩阵重叠

给定两个矩阵的左下座标和右上座标,如何判断这两个矩阵是否重叠?
解法一:
矩形重叠的情况太多,难以处理,所以转而思考矩形不重叠的情况。
考虑rec2在rec1的左边、右边、上边、下边
左边:rec1[0] >= rec2[2]
右边:rec1[2] <= rec2[0]
上边:rec1[3] <= rec2[1]
下边:rec1[1] >= rec2[3]

class Solution {
public:
    bool isRectangleOverlap(vector<int>& rec1, vector<int>& rec2) {
        //考虑重叠的情况太复杂,考虑不重叠的情况
        if(rec1[0] >= rec2[2] || rec1[2] <= rec2[0] || rec1[3] <= rec2[1] || rec1[1] >= rec2[3]){
            return false;
        }
        return true;
    }
};

解法二:参考leetcode官方解法二
当有两个矩阵重叠的时候,将两个矩阵分别投影到x轴和y轴,在x轴上有两个线段(rec1[0],rec1[2])和(rec2[0],rec2[2]),在y轴上有两个线段(rec1[1],rec1[3])和(rec2[1],rec2[3])。根据数学知识我们可以知道,当 min(rec1[2], rec2[2]) > max(rec1[0], rec2[0]) 时,这两条线段有交集。当min(rec1[3],rec2[3]) > max(rec1[1],rec2[1])时,有交集。

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

此题引出另外一道题leetcode 223矩形的面积,计算有两个矩形组成的面积之和。
对于两个矩阵分成两种情况,重叠和不重叠。
不重叠:直接两个面积相加
重叠:两个面积相加 - 重叠的面积

class Solution {
public:
    int computeArea(int A, int B, int C, int D, int E, int F, int G, int H) {
        //第一个矩形面积
        int x = C - A;
        int y = D - B;
        long areaA = x*y;
        //第二个矩形面积
        x = G - E;
        y = H - F;
        long areaB = x * y;
        //判断是否重叠
        if(A >= G || E >= C || F >= D || B >= H){ //不重叠
            return areaA + areaB;
        }
        //重叠 = 面积和 - 重叠的部分
        int x1 = max(A,E);
        int y1 = max(B,F);
        int x2 = min(C,G);
        int y2 = min(D,H);
        long area = (x2 - x1) * (y2 - y1);
        return areaA + areaB - area;
    }
};

leetcode 867转置矩阵:将每一列变成每一行

class Solution {
public:
    vector<vector<int>> transpose(vector<vector<int>>& A) {
        vector<vector<int>> res;
        for(int i = 0; i < A[0].size(); i++){ //列
            vector<int> t;
            for(int j = 0; j < A.size(); j++){//行
                t.push_back(A[j][i]);
            }
            res.push_back(t);
        }
        return res;
        //res[i][j] = A[j][i]
        /*
        vector<vector<int>> res(A[0].size(),vector<int>(A.size(),0));
        for(int i = 0; i < A[0].size(); i++){ //列
           for(int j = 0; j < A.size(); j++){//行
                res[i][j] = A[j][i];
           }
        }
        return res;*/
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章