题解
这题暴力遍历也行,枚举起始点就好。
但是暴力法做了太多无用计算,其实我们只关心有1的位置。
那么我们可以把有1的位置信息提取出来,然后比较当这两组的1碰撞在一起时候的总数即可。
Code
O(n^2+AB)
int largestOverlap(vector<vector<int>>& A, vector<vector<int>>& B) {
n = A.size();
int ans=0;
vector<int> La,Lb;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
// 100*i+j 位置映射 独一无二
if(A[i][j]==1) La.push_back(i*100+j);
if(B[i][j]==1) Lb.push_back(i*100+j);
}
unordered_map<int,int> mmp;
for(int i:La){
for(int j:Lb)
mmp[i-j]++;// 考虑当1与1相撞时候 该交叠情况下1碰撞总数
}
for(auto it:mmp){
ans=max(ans,it.second);
}
return ans;
}
拙作 O(n^4)
class Solution {
public:
int n;
int largestOverlap(vector<vector<int>>& A, vector<vector<int>>& B) {
n = A.size();
int ans=-9999999;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
ans=max(ans,matchN(A,B,i,j));
// if(ans==5) return i*j+13;
ans=max(ans,matchN(B,A,i,j));
// if(ans==5) return i*j+17;
}
return ans;
}
int matchN(vector<vector<int>>& A, vector<vector<int>>& B,int ax,int ay){
int res=0;
int x,y;
x=y=0;
for(int i=ax;i<n;i++){
for(int j=ay;j<n;j++){
if((A[i][j]==1)&&(B[x][y]==1))
res++;
y++;
}
x++;
y=0;
}
return res;
}
};