835. 图像重叠 中等
给你两个图像 img1 和 img2 ,两个图像的大小都是 n x n ,用大小相同的二维正方形矩阵表示。(并且为二进制矩阵,只包含若干 0 和若干 1 )
转换其中一个图像,向左,右,上,或下滑动任何数量的单位,并把它放在另一个图像的上面。之后,该转换的 重叠 是指两个图像都具有 1 的位置的数目。
(请注意,转换 不包括 向任何方向旋转。)
最大可能的重叠是多少?
示例 1:
输入:img1 = [[1,1,0],[0,1,0],[0,1,0]], img2 = [[0,0,0],[0,1,1],[0,0,1]]
输出:3
解释:将 img1 向右移动 1 个单位,再向下移动 1 个单位。
两个图像都具有 1 的位置的数目是 3(用红色标识)。
示例 2:
输入:img1 = [[1]], img2 = [[1]]
输出:1
示例 3:
输入:img1 = [[0]], img2 = [[0]]
输出:0
提示:
- n == img1.length
- n == img1[i].length
- n == img2.length
- n == img2[i].length
- 1 <= n <= 30
- img1[i][j] 为 0 或 1
- img2[i][j] 为 0 或 1
代码参考:
package main
import "fmt"
func main() {
a := [][]int{
{1, 1, 0},
{0, 1, 0},
{0, 1, 0},
}
b := [][]int{
{0, 0, 0},
{0, 1, 1},
{0, 0, 1},
}
fmt.Println(largestOverlap(a, b)) // 3
}
// n <= 30,暴力遍历可接受
func largestOverlap(A [][]int, B [][]int) int {
max := 0
n := len(A)
for i := 0; i < n; i++ {
for j := 0; j < n; j ++ {
countA, countB := 0, 0
for r := i; r < n; r++ {
for c := j; c < n; c++ {
preR, preC := r-i, c-j
if A[r][c] == 1 && B[preR][preC] == 1 { // 重复且为 1 的位置计数
countA += 1
}
if B[r][c] == 1 && A[preR][preC] == 1 {
countB += 1
}
}
}
if countA > max {
max = countA
}
if countB > max {
max = countB
}
}
}
return max
}
最后编辑: kuteng 文档更新时间: 2021-06-05 10:16 作者:kuteng