1. 题目
给出两个图像 A 和 B ,A 和 B 为大小相同的二维正方形矩阵。(并且为二进制矩阵,只包含0和1)。
我们转换其中一个图像,向左,右,上,或下滑动任何数量的单位,并把它放在另一个图像的上面。
之后,该转换的重叠是指两个图像都具有 1 的位置的数目。
(请注意,转换不包括向任何方向旋转。)
最大可能的重叠是什么?
示例 1:
输入:A = [[1,1,0],[0,1,0],[0,1,0]]B = [[0,0,0],[0,1,1],[0,0,1]]
输出:3
解释: 将 A 向右移动一个单位,然后向下移动一个单位。
注意:
1 <= A.length = A[0].length = B.length = B[0].length <= 30
0 <= A[i][j], B[i][j] <= 1
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/image-overlap
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
注意题目的意思不是说循环每个位置都要比较,只比较重叠的部分
- 记录偏移组合情况下,AB都为1的个数
- 最后遍历所有的偏移情况,取最大的
- 时间复杂度 O(n4)O(n^4)O(n4)
class Solution {
public:int largestOverlap(vector<vector<int>>& A, vector<vector<int>>& B) {int i,j,x,y,n=A.size(),maxoverlap = 0;vector<vector<int>> offset(2*n+1,vector<int>(2*n+1,0));for(i = 0; i < n; ++i)for(j = 0; j < n; ++j)if(A[i][j])for(x = 0; x < n; ++x)for(y = 0; y < n; ++y)if(B[x][y])offset[i-x+n][j-y+n]++;for(i = 0; i <= 2*n; ++i)for(j = 0; j <= 2*n; ++j)maxoverlap = max(maxoverlap, offset[i][j]);return maxoverlap;}
};
32 ms 9.2 MB
如果1的个数比较稀疏,题解区还有个很强的解答
- 先分别把A、B是1的位置映射为一个int
- 然后遍历上面的组合,位置差作为key,计数
class Solution {
public:int largestOverlap(vector<vector<int>>& A, vector<vector<int>>& B) {int i,j,n=A.size(),maxoverlap = 0;unordered_map<int,int> offset;vector<int> A_, B_;for(i = 0; i < n; ++i)for(j = 0; j < n; ++j){if(A[i][j])A_.push_back((i<<6)+j);if(B[i][j])B_.push_back((i<<6)+j);}for(auto Ai : A_)for(auto Bi : B_)offset[Ai-Bi]++;for(auto off : offset)maxoverlap = max(maxoverlap, off.second);return maxoverlap;}
};
128 ms 11.5 MB
python3 解答
class Solution:def largestOverlap(self, A: List[List[int]], B: List[List[int]]) -> int:n = len(A)maxoverlap = 0offset = [[0]*(2*n+1) for _ in range(2*n+1)]for i in range(n):for j in range(n):if A[i][j]:for x in range(n):for y in range(n):if B[x][y]:offset[i-x+n][j-y+n] += 1for i in range(2*n+1):for j in range(2*n+1):maxoverlap = max(maxoverlap, offset[i][j])return maxoverlap
384 ms 13.5 MB