1. 程式人生 > 實用技巧 >LeetCode 835. 影象重疊

LeetCode 835. 影象重疊

給出兩個影象 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

class Solution:
    def largestOverlap(self, A: List[List[int]], B: List[List[int]]) -> int:
        N = len(A)
        LA = [(xi, yi) for xi in range(N) for yi in range(N) if A[xi][yi]]
        LB = [(xi, yi) for xi in range(N) for yi in range(N) if B[xi][yi]]
        d = collections.Counter([(x1 - x2, y1 - y2) for (x1, y1) in LA for (x2, y2) in LB])
        return max(d.values() or [0])