給定兩個矩陣的左下座標和右上座標,如何判斷這兩個矩陣是否重疊?
解法一:
矩形重疊的情況太多,難以處理,所以轉而思考矩形不重疊的情況。
考慮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;*/
}
};