-
题目链接 https://leetcode-cn.com/problems/image-overlap/submissions/
-
题目描述
-
给出两个图像
A
和B
,A
和B
为大小相同的二维正方形矩阵。(并且为二进制矩阵,只包含0和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中所有为1的位置与B中所有为1的位置做差,统计每个差的个数,找到个数最多的那个!这里的差是向量减法的差,差的意思是A中的某个1到达B中的某个所需要的一种移动方式。那么出现个数最多的那个差的个数(好吧。。。这样说好绕)就是我们要的结果。(代码2)
-
代码
- python
class Solution: def largestOverlap(self, A, B): N = len(A) vis = set() _max = 0 def _helper(i, j): nonlocal vis, _max if i >= N or i <= -1 * N or j >= N or j <= -1 * N or (i, j) in vis: return vis.add((i, j)) c, r = N - abs(i), N - abs(j) ax0, ay0 = -(i < 0) * i, -(j < 0) * j bx0, by0 = (i > 0) * i, (j > 0) * j _sum = 0 for k in range(c): for p in range(r): _sum += A[ax0 + k][ay0 + p] & B[bx0 + k][by0 + p] _max = max(_max, _sum) _helper(i-1, j);_helper(i+1, j);_helper(i, j-1);_helper(i, j+1) _helper(0, 0) return _max
- python
def largestOverlap(self, A, B): N = len(A) LA = [i / N * 100 + i % N for i in xrange(N * N) if A[i / N][i % N]] LB = [i / N * 100 + i % N for i in xrange(N * N) if B[i / N][i % N]] c = collections.Counter(i - j for i in LA for j in LB) return max(c.values() or [0])
- python
leetcode 835. 图像重叠
最新推荐文章于 2022-05-02 23:17:44 发布