Skip to content

Commit 7ceaff4

Browse files
authored
feat: add solutions to lc problem: No.0835 (doocs#1365)
No.0835.Image Overlap
1 parent 50297c4 commit 7ceaff4

File tree

7 files changed

+346
-2
lines changed

7 files changed

+346
-2
lines changed

solution/0800-0899/0835.Image Overlap/README.md

+124-1
Original file line numberDiff line numberDiff line change
@@ -61,22 +61,145 @@
6161

6262
<!-- 这里可写通用的实现逻辑 -->
6363

64+
**方法一:枚举**
65+
66+
我们可以枚举 $img1$ 和 $img2$ 的每个 $1$ 的位置,分别记为 $(i, j)$ 和 $(h, k)$。然后我们计算得到偏移量 $(i - h, j - k)$,记为 $(dx, dy)$,用哈希表 $cnt$ 记录每个偏移量出现的次数。最后我们遍历哈希表 $cnt$,找到出现次数最多的偏移量,即为答案。
67+
68+
时间复杂度 $O(n^4)$,空间复杂度 $O(n^2)$。其中 $n$ 是 $img1$ 的边长。
69+
6470
<!-- tabs:start -->
6571

6672
### **Python3**
6773

6874
<!-- 这里可写当前语言的特殊实现逻辑 -->
6975

7076
```python
71-
77+
class Solution:
78+
def largestOverlap(self, img1: List[List[int]], img2: List[List[int]]) -> int:
79+
n = len(img1)
80+
cnt = Counter()
81+
for i in range(n):
82+
for j in range(n):
83+
if img1[i][j]:
84+
for h in range(n):
85+
for k in range(n):
86+
if img2[h][k]:
87+
cnt[(i - h, j - k)] += 1
88+
return max(cnt.values()) if cnt else 0
7289
```
7390

7491
### **Java**
7592

7693
<!-- 这里可写当前语言的特殊实现逻辑 -->
7794

7895
```java
96+
class Solution {
97+
public int largestOverlap(int[][] img1, int[][] img2) {
98+
int n = img1.length;
99+
Map<List<Integer>, Integer> cnt = new HashMap<>();
100+
int ans = 0;
101+
for (int i = 0; i < n; ++i) {
102+
for (int j = 0; j < n; ++j) {
103+
if (img1[i][j] == 1) {
104+
for (int h = 0; h < n; ++h) {
105+
for (int k = 0; k < n; ++k) {
106+
if (img2[h][k] == 1) {
107+
List<Integer> t = List.of(i - h, j - k);
108+
ans = Math.max(ans, cnt.merge(t, 1, Integer::sum));
109+
}
110+
}
111+
}
112+
}
113+
}
114+
}
115+
return ans;
116+
}
117+
}
118+
```
119+
120+
### **C++**
121+
122+
```cpp
123+
class Solution {
124+
public:
125+
int largestOverlap(vector<vector<int>>& img1, vector<vector<int>>& img2) {
126+
int n = img1.size();
127+
map<pair<int, int>, int> cnt;
128+
int ans = 0;
129+
for (int i = 0; i < n; ++i) {
130+
for (int j = 0; j < n; ++j) {
131+
if (img1[i][j]) {
132+
for (int h = 0; h < n; ++h) {
133+
for (int k = 0; k < n; ++k) {
134+
if (img2[h][k]) {
135+
ans = max(ans, ++cnt[{i - h, j - k}]);
136+
}
137+
}
138+
}
139+
}
140+
}
141+
}
142+
return ans;
143+
}
144+
};
145+
```
146+
147+
### **Go**
148+
149+
```go
150+
func largestOverlap(img1 [][]int, img2 [][]int) (ans int) {
151+
type pair struct{ x, y int }
152+
cnt := map[pair]int{}
153+
for i, row1 := range img1 {
154+
for j, x1 := range row1 {
155+
if x1 == 1 {
156+
for h, row2 := range img2 {
157+
for k, x2 := range row2 {
158+
if x2 == 1 {
159+
t := pair{i - h, j - k}
160+
cnt[t]++
161+
ans = max(ans, cnt[t])
162+
}
163+
}
164+
}
165+
}
166+
}
167+
}
168+
return
169+
}
170+
171+
func max(a, b int) int {
172+
if a > b {
173+
return a
174+
}
175+
return b
176+
}
177+
```
79178

179+
### **TypeScript**
180+
181+
```ts
182+
function largestOverlap(img1: number[][], img2: number[][]): number {
183+
const n = img1.length;
184+
const cnt: Map<number, number> = new Map();
185+
let ans = 0;
186+
for (let i = 0; i < n; ++i) {
187+
for (let j = 0; j < n; ++j) {
188+
if (img1[i][j] === 1) {
189+
for (let h = 0; h < n; ++h) {
190+
for (let k = 0; k < n; ++k) {
191+
if (img2[h][k] === 1) {
192+
const t = (i - h) * 200 + (j - k);
193+
cnt.set(t, (cnt.get(t) ?? 0) + 1);
194+
ans = Math.max(ans, cnt.get(t)!);
195+
}
196+
}
197+
}
198+
}
199+
}
200+
}
201+
return ans;
202+
}
80203
```
81204

82205
### **...**

solution/0800-0899/0835.Image Overlap/README_EN.md

+118-1
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,130 @@ The number of positions that have a 1 in both images is 3 (shown in red).
5656
### **Python3**
5757

5858
```python
59-
59+
class Solution:
60+
def largestOverlap(self, img1: List[List[int]], img2: List[List[int]]) -> int:
61+
n = len(img1)
62+
cnt = Counter()
63+
for i in range(n):
64+
for j in range(n):
65+
if img1[i][j]:
66+
for h in range(n):
67+
for k in range(n):
68+
if img2[h][k]:
69+
cnt[(i - h, j - k)] += 1
70+
return max(cnt.values()) if cnt else 0
6071
```
6172

6273
### **Java**
6374

6475
```java
76+
class Solution {
77+
public int largestOverlap(int[][] img1, int[][] img2) {
78+
int n = img1.length;
79+
Map<List<Integer>, Integer> cnt = new HashMap<>();
80+
int ans = 0;
81+
for (int i = 0; i < n; ++i) {
82+
for (int j = 0; j < n; ++j) {
83+
if (img1[i][j] == 1) {
84+
for (int h = 0; h < n; ++h) {
85+
for (int k = 0; k < n; ++k) {
86+
if (img2[h][k] == 1) {
87+
List<Integer> t = List.of(i - h, j - k);
88+
ans = Math.max(ans, cnt.merge(t, 1, Integer::sum));
89+
}
90+
}
91+
}
92+
}
93+
}
94+
}
95+
return ans;
96+
}
97+
}
98+
```
99+
100+
### **C++**
101+
102+
```cpp
103+
class Solution {
104+
public:
105+
int largestOverlap(vector<vector<int>>& img1, vector<vector<int>>& img2) {
106+
int n = img1.size();
107+
map<pair<int, int>, int> cnt;
108+
int ans = 0;
109+
for (int i = 0; i < n; ++i) {
110+
for (int j = 0; j < n; ++j) {
111+
if (img1[i][j]) {
112+
for (int h = 0; h < n; ++h) {
113+
for (int k = 0; k < n; ++k) {
114+
if (img2[h][k]) {
115+
ans = max(ans, ++cnt[{i - h, j - k}]);
116+
}
117+
}
118+
}
119+
}
120+
}
121+
}
122+
return ans;
123+
}
124+
};
125+
```
126+
127+
### **Go**
128+
129+
```go
130+
func largestOverlap(img1 [][]int, img2 [][]int) (ans int) {
131+
type pair struct{ x, y int }
132+
cnt := map[pair]int{}
133+
for i, row1 := range img1 {
134+
for j, x1 := range row1 {
135+
if x1 == 1 {
136+
for h, row2 := range img2 {
137+
for k, x2 := range row2 {
138+
if x2 == 1 {
139+
t := pair{i - h, j - k}
140+
cnt[t]++
141+
ans = max(ans, cnt[t])
142+
}
143+
}
144+
}
145+
}
146+
}
147+
}
148+
return
149+
}
150+
151+
func max(a, b int) int {
152+
if a > b {
153+
return a
154+
}
155+
return b
156+
}
157+
```
65158

159+
### **TypeScript**
160+
161+
```ts
162+
function largestOverlap(img1: number[][], img2: number[][]): number {
163+
const n = img1.length;
164+
const cnt: Map<number, number> = new Map();
165+
let ans = 0;
166+
for (let i = 0; i < n; ++i) {
167+
for (let j = 0; j < n; ++j) {
168+
if (img1[i][j] === 1) {
169+
for (let h = 0; h < n; ++h) {
170+
for (let k = 0; k < n; ++k) {
171+
if (img2[h][k] === 1) {
172+
const t = (i - h) * 200 + (j - k);
173+
cnt.set(t, (cnt.get(t) ?? 0) + 1);
174+
ans = Math.max(ans, cnt.get(t)!);
175+
}
176+
}
177+
}
178+
}
179+
}
180+
}
181+
return ans;
182+
}
66183
```
67184

68185
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
class Solution {
2+
public:
3+
int largestOverlap(vector<vector<int>>& img1, vector<vector<int>>& img2) {
4+
int n = img1.size();
5+
map<pair<int, int>, int> cnt;
6+
int ans = 0;
7+
for (int i = 0; i < n; ++i) {
8+
for (int j = 0; j < n; ++j) {
9+
if (img1[i][j]) {
10+
for (int h = 0; h < n; ++h) {
11+
for (int k = 0; k < n; ++k) {
12+
if (img2[h][k]) {
13+
ans = max(ans, ++cnt[{i - h, j - k}]);
14+
}
15+
}
16+
}
17+
}
18+
}
19+
}
20+
return ans;
21+
}
22+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
func largestOverlap(img1 [][]int, img2 [][]int) (ans int) {
2+
type pair struct{ x, y int }
3+
cnt := map[pair]int{}
4+
for i, row1 := range img1 {
5+
for j, x1 := range row1 {
6+
if x1 == 1 {
7+
for h, row2 := range img2 {
8+
for k, x2 := range row2 {
9+
if x2 == 1 {
10+
t := pair{i - h, j - k}
11+
cnt[t]++
12+
ans = max(ans, cnt[t])
13+
}
14+
}
15+
}
16+
}
17+
}
18+
}
19+
return
20+
}
21+
22+
func max(a, b int) int {
23+
if a > b {
24+
return a
25+
}
26+
return b
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
class Solution {
2+
public int largestOverlap(int[][] img1, int[][] img2) {
3+
int n = img1.length;
4+
Map<List<Integer>, Integer> cnt = new HashMap<>();
5+
int ans = 0;
6+
for (int i = 0; i < n; ++i) {
7+
for (int j = 0; j < n; ++j) {
8+
if (img1[i][j] == 1) {
9+
for (int h = 0; h < n; ++h) {
10+
for (int k = 0; k < n; ++k) {
11+
if (img2[h][k] == 1) {
12+
List<Integer> t = List.of(i - h, j - k);
13+
ans = Math.max(ans, cnt.merge(t, 1, Integer::sum));
14+
}
15+
}
16+
}
17+
}
18+
}
19+
}
20+
return ans;
21+
}
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class Solution:
2+
def largestOverlap(self, img1: List[List[int]], img2: List[List[int]]) -> int:
3+
n = len(img1)
4+
cnt = Counter()
5+
for i in range(n):
6+
for j in range(n):
7+
if img1[i][j]:
8+
for h in range(n):
9+
for k in range(n):
10+
if img2[h][k]:
11+
cnt[(i - h, j - k)] += 1
12+
return max(cnt.values()) if cnt else 0
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
function largestOverlap(img1: number[][], img2: number[][]): number {
2+
const n = img1.length;
3+
const cnt: Map<number, number> = new Map();
4+
let ans = 0;
5+
for (let i = 0; i < n; ++i) {
6+
for (let j = 0; j < n; ++j) {
7+
if (img1[i][j] === 1) {
8+
for (let h = 0; h < n; ++h) {
9+
for (let k = 0; k < n; ++k) {
10+
if (img2[h][k] === 1) {
11+
const t = (i - h) * 200 + (j - k);
12+
cnt.set(t, (cnt.get(t) ?? 0) + 1);
13+
ans = Math.max(ans, cnt.get(t)!);
14+
}
15+
}
16+
}
17+
}
18+
}
19+
}
20+
return ans;
21+
}

0 commit comments

Comments
 (0)