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;*/
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章