题目链接:835. 图像重叠(中等)
算法原理:
解法:暴力枚举
时间复杂度O(N⁴)
11ms击败80.14%
记:
n:矩阵边长
dx:img1 向下移动 dx 单位(dx>0是往下挪,dx<0是往上挪)
dy:img1 向右移动 dx 单位(dx>0是往右挪,dx<0是往左挪)
cnt1:当前这个平移方案下,重复 1 的总数
那么 img1ij 平移后对应 img2i+dxj+dy
必须保证移动后不越界:0 <= i+dx < n
同时本身也不能越界:0 <= i < n
二者取交集:max(-dx,0) <= i < min(n-dx,n)
遍历时先枚举移动多少单位,再去枚举每一个元素在该移动单位下能重叠的 1 的个数(两个数都是1,才能让计数+1)
Java代码:
java
class Solution {
//835. 图像重叠
public int largestOverlap(int[][] img1, int[][] img2) {
int n=img1.length;
int ret=0;
for(int dx=1-n;dx<n;dx++){
for(int dy=1-n;dy<n;dy++){
int cnt1=0;
for(int i=Math.max(-dx,0);i<Math.min(n-dx,n);i++){
for(int j=Math.max(-dy,0);j<Math.min(n-dy,n);j++){
//两个数都是1,才能让cnt1增加1
cnt1+=img1[i][j]*img2[i+dx][j+dy];
}
}
ret=Math.max(ret,cnt1);
}
}
return ret;
}
}