Skip to content

Commit 9dc29fe

Browse files
committed
feat: add solutions to lc problem: No.0694
No.0694.Number of Distinct Islands
1 parent ae56156 commit 9dc29fe

File tree

11 files changed

+418
-72
lines changed

11 files changed

+418
-72
lines changed

solution/0000-0099/0017.Letter Combinations of a Phone Number/README.md

+6-6
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ class Solution {
114114
### **Go**
115115

116116
```go
117-
var table = map[string][]string {
117+
var table = map[string][]string{
118118
"2": {"a", "b", "c"},
119119
"3": {"d", "e", "f"},
120120
"4": {"g", "h", "i"},
@@ -130,12 +130,12 @@ func letterCombinations(digits string) []string {
130130
return make([]string, 0)
131131
}
132132
var result = table[string(digits[0])]
133-
for i:=1; i<len(digits); i++ {
133+
for i := 1; i < len(digits); i++ {
134134
t := table[string(digits[i])]
135-
nr := make([]string, len(result) * len(t))
136-
for j:=0; j<len(result); j++ {
137-
for k:=0; k<len(t); k++ {
138-
nr[len(t)*j + k] = result[j] + t[k]
135+
nr := make([]string, len(result)*len(t))
136+
for j := 0; j < len(result); j++ {
137+
for k := 0; k < len(t); k++ {
138+
nr[len(t)*j+k] = result[j] + t[k]
139139
}
140140
}
141141
result = nr

solution/0000-0099/0017.Letter Combinations of a Phone Number/README_EN.md

+6-6
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ class Solution {
104104
### **Go**
105105

106106
```go
107-
var table = map[string][]string {
107+
var table = map[string][]string{
108108
"2": {"a", "b", "c"},
109109
"3": {"d", "e", "f"},
110110
"4": {"g", "h", "i"},
@@ -120,12 +120,12 @@ func letterCombinations(digits string) []string {
120120
return make([]string, 0)
121121
}
122122
var result = table[string(digits[0])]
123-
for i:=1; i<len(digits); i++ {
123+
for i := 1; i < len(digits); i++ {
124124
t := table[string(digits[i])]
125-
nr := make([]string, len(result) * len(t))
126-
for j:=0; j<len(result); j++ {
127-
for k:=0; k<len(t); k++ {
128-
nr[len(t)*j + k] = result[j] + t[k]
125+
nr := make([]string, len(result)*len(t))
126+
for j := 0; j < len(result); j++ {
127+
for k := 0; k < len(t); k++ {
128+
nr[len(t)*j+k] = result[j] + t[k]
129129
}
130130
}
131131
result = nr

solution/0000-0099/0017.Letter Combinations of a Phone Number/Solution.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
var table = map[string][]string {
1+
var table = map[string][]string{
22
"2": {"a", "b", "c"},
33
"3": {"d", "e", "f"},
44
"4": {"g", "h", "i"},
@@ -14,12 +14,12 @@ func letterCombinations(digits string) []string {
1414
return make([]string, 0)
1515
}
1616
var result = table[string(digits[0])]
17-
for i:=1; i<len(digits); i++ {
17+
for i := 1; i < len(digits); i++ {
1818
t := table[string(digits[i])]
19-
nr := make([]string, len(result) * len(t))
20-
for j:=0; j<len(result); j++ {
21-
for k:=0; k<len(t); k++ {
22-
nr[len(t)*j + k] = result[j] + t[k]
19+
nr := make([]string, len(result)*len(t))
20+
for j := 0; j < len(result); j++ {
21+
for k := 0; k < len(t); k++ {
22+
nr[len(t)*j+k] = result[j] + t[k]
2323
}
2424
}
2525
result = nr

solution/0600-0699/0694.Number of Distinct Islands/README.md

+131-1
Original file line numberDiff line numberDiff line change
@@ -53,22 +53,152 @@
5353

5454
<!-- 这里可写通用的实现逻辑 -->
5555

56+
遍历网格,若坐标点 `(i, j)` 对应的值是 1,进行 DFS 遍历,找到对应的岛屿,并且将遍历方向进行序列化,用哈希表存储。最后返回哈希表的大小即可。
57+
5658
<!-- tabs:start -->
5759

5860
### **Python3**
5961

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

6264
```python
63-
65+
class Solution:
66+
def numDistinctIslands(self, grid: List[List[int]]) -> int:
67+
def dfs(i, j, direction, path):
68+
grid[i][j] = 0
69+
path.append(str(direction))
70+
dirs = [-1, 0, 1, 0, -1]
71+
for k in range(1, 5):
72+
x, y = i + dirs[k - 1], j + dirs[k]
73+
if 0 <= x < m and 0 <= y < n and grid[x][y] == 1:
74+
dfs(x, y, k, path)
75+
path.append(str(-direction))
76+
77+
paths = set()
78+
path = []
79+
m, n = len(grid), len(grid[0])
80+
for i in range(m):
81+
for j in range(n):
82+
if grid[i][j] == 1:
83+
dfs(i, j, 0, path)
84+
paths.add(''.join(path))
85+
path.clear()
86+
return len(paths)
6487
```
6588

6689
### **Java**
6790

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

7093
```java
94+
class Solution {
95+
private int m;
96+
private int n;
97+
private int[][] grid;
98+
99+
public int numDistinctIslands(int[][] grid) {
100+
m = grid.length;
101+
n = grid[0].length;
102+
this.grid = grid;
103+
Set<String> paths = new HashSet<>();
104+
105+
for (int i = 0; i < m; ++i) {
106+
for (int j = 0; j < n; ++j) {
107+
if (grid[i][j] == 1) {
108+
StringBuilder path = new StringBuilder();
109+
dfs(i, j, 0, path);
110+
paths.add(path.toString());
111+
}
112+
}
113+
}
114+
return paths.size();
115+
}
116+
117+
private void dfs(int i, int j, int direction, StringBuilder path) {
118+
grid[i][j] = 0;
119+
path.append(direction);
120+
int[] dirs = {-1, 0, 1, 0, -1};
121+
for (int k = 1; k < 5; ++k) {
122+
int x = i + dirs[k - 1];
123+
int y = j + dirs[k];
124+
if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == 1) {
125+
dfs(x, y, k, path);
126+
}
127+
}
128+
path.append(direction);
129+
}
130+
}
131+
```
132+
133+
### **C++**
134+
135+
```cpp
136+
class Solution {
137+
public:
138+
int numDistinctIslands(vector<vector<int>>& grid) {
139+
unordered_set<string> paths;
140+
string path;
141+
for (int i = 0; i < grid.size(); ++i)
142+
{
143+
for (int j = 0; j < grid[0].size(); ++j)
144+
{
145+
if (grid[i][j] == 1)
146+
{
147+
path = "";
148+
dfs(i, j, 0, grid, path);
149+
paths.insert(path);
150+
}
151+
}
152+
}
153+
return paths.size();
154+
}
155+
156+
void dfs(int i, int j, int direction, vector<vector<int>>& grid, string& path) {
157+
grid[i][j] = 0;
158+
path += to_string(direction);
159+
vector<int> dirs = {-1, 0, 1, 0, -1};
160+
for (int k = 1; k < 5; ++k)
161+
{
162+
int x = i + dirs[k - 1], y = j + dirs[k];
163+
if (x >= 0 && x < grid.size() && y >= 0 && y < grid[0].size() && grid[x][y] == 1)
164+
dfs(x, y, k, grid, path);
165+
}
166+
path += to_string(direction);
167+
}
168+
};
169+
```
71170

171+
### **Go**
172+
173+
```go
174+
func numDistinctIslands(grid [][]int) int {
175+
m, n := len(grid), len(grid[0])
176+
paths := make(map[string]bool)
177+
path := ""
178+
var dfs func(i, j, direction int)
179+
dfs = func(i, j, direction int) {
180+
grid[i][j] = 0
181+
path += strconv.Itoa(direction)
182+
dirs := []int{-1, 0, 1, 0, -1}
183+
for k := 1; k < 5; k++ {
184+
x, y := i+dirs[k-1], j+dirs[k]
185+
if x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == 1 {
186+
dfs(x, y, k)
187+
}
188+
}
189+
path += strconv.Itoa(direction)
190+
}
191+
for i := 0; i < m; i++ {
192+
for j := 0; j < n; j++ {
193+
if grid[i][j] == 1 {
194+
path = ""
195+
dfs(i, j, 0)
196+
paths[path] = true
197+
}
198+
}
199+
}
200+
return len(paths)
201+
}
72202
```
73203

74204
### **...**

0 commit comments

Comments
 (0)