给定两个矩阵的左下座标和右上座标,如何判断这两个矩阵是否重叠?
解法一:
矩形重叠的情况太多,难以处理,所以转而思考矩形不重叠的情况。
考虑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;*/
}
};