Skip to content

Commit 50f9a5d

Browse files
committed
feat: add solutions to lc problem: No.1162
No.1162.As Far from Land as Possible
1 parent 9b16d42 commit 50f9a5d

File tree

11 files changed

+255
-250
lines changed

11 files changed

+255
-250
lines changed

solution/1100-1199/1161.Maximum Level Sum of a Binary Tree/README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,14 @@
5050

5151
BFS 层次遍历,求每一层的节点和,找出节点和最大的层,若有多个层的节点和最大,则返回最小的层。
5252

53+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为二叉树的节点数。
54+
5355
**方法二:DFS**
5456

57+
我们也可以使用 DFS 求解。我们用一个数组 $s$ 来存储每一层的节点和,数组的下标表示层数,数组的值表示节点和。我们使用 DFS 遍历二叉树,将每个节点的值加到对应层数的节点和上。最后,我们返回 $s$ 中的最大值对应的下标即可。
58+
59+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为二叉树的节点数。
60+
5561
<!-- tabs:start -->
5662

5763
### **Python3**

solution/1100-1199/1162.As Far from Land as Possible/README.md

Lines changed: 91 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,17 @@
5353

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

56-
BFS。
56+
**方法一:BFS**
57+
58+
我们可以将所有陆地单元格加入队列 $q$ 中,如果队列为空,或者队列中元素个数等于网格中的单元格个数,则说明网格中只有陆地或者海洋,返回 $-1$。
59+
60+
否则,我们从陆地单元格开始进行广度优先搜索。定义初始步数 $ans=-1$。
61+
62+
在每一轮搜索中,我们将队列中的所有单元格向四个方向扩散,若单元格是海洋单元格,则将其标记为陆地单元格,并加入队列。在一轮扩散完成后,我们将步数加 $1$。重复这一过程,直到队列为空。
63+
64+
最后,我们返回步数 $ans$。
65+
66+
时间复杂度 $O(n^2)$,空间复杂度 $O(n^2)$。其中 $n$ 是网格的边长。
5767

5868
<!-- tabs:start -->
5969

@@ -89,7 +99,7 @@ class Solution:
8999
class Solution {
90100
public int maxDistance(int[][] grid) {
91101
int n = grid.length;
92-
Deque<int[]> q = new LinkedList<>();
102+
Deque<int[]> q = new ArrayDeque<>();
93103
for (int i = 0; i < n; ++i) {
94104
for (int j = 0; j < n; ++j) {
95105
if (grid[i][j] == 1) {
@@ -98,65 +108,25 @@ class Solution {
98108
}
99109
}
100110
int ans = -1;
101-
boolean valid = false;
111+
if (q.isEmpty() || q.size() == n * n) {
112+
return ans;
113+
}
102114
int[] dirs = {-1, 0, 1, 0, -1};
103115
while (!q.isEmpty()) {
104-
++ans;
105-
for (int k = q.size(); k > 0; --k) {
116+
for (int i = q.size(); i > 0; --i) {
106117
int[] p = q.poll();
107-
for (int i = 0; i < 4; ++i) {
108-
int x = p[0] + dirs[i];
109-
int y = p[1] + dirs[i + 1];
118+
for (int k = 0; k < 4; ++k) {
119+
int x = p[0] + dirs[k], y = p[1] + dirs[k + 1];
110120
if (x >= 0 && x < n && y >= 0 && y < n && grid[x][y] == 0) {
111-
valid = true;
112121
grid[x][y] = 1;
113122
q.offer(new int[] {x, y});
114123
}
115124
}
116125
}
126+
++ans;
117127
}
118-
return valid ? ans : -1;
119-
}
120-
}
121-
```
122-
123-
### **TypeScript**
124-
125-
```ts
126-
function maxDistance(grid: number[][]): number {
127-
const m = grid.length,
128-
n = grid[0].length;
129-
let queue: Array<Array<number>> = [];
130-
for (let i = 0; i < m; i++) {
131-
for (let j = 0; j < n; j++) {
132-
if (grid[i][j]) {
133-
queue.push([i, j]);
134-
}
135-
}
136-
}
137-
if ([0, m * n].includes(queue.length)) return -1;
138-
const directions = [
139-
[0, 1],
140-
[0, -1],
141-
[1, 0],
142-
[-1, 0],
143-
];
144-
let depth = 1;
145-
while (queue.length) {
146-
depth += 1;
147-
let nextLevel: Array<Array<number>> = [];
148-
for (let [x, y] of queue) {
149-
for (let [dx, dy] of directions) {
150-
const [i, j] = [x + dx, y + dy];
151-
if (i >= 0 && i < m && j >= 0 && j < n && !grid[i][j]) {
152-
grid[i][j] = depth;
153-
nextLevel.push([i, j]);
154-
}
155-
}
156-
}
157-
queue = nextLevel;
128+
return ans;
158129
}
159-
return depth - 2;
160130
}
161131
```
162132

@@ -167,32 +137,34 @@ class Solution {
167137
public:
168138
int maxDistance(vector<vector<int>>& grid) {
169139
int n = grid.size();
170-
typedef pair<int, int> pii;
171-
queue<pii> q;
172-
for (int i = 0; i < n; ++i)
173-
for (int j = 0; j < n; ++j)
174-
if (grid[i][j] == 1)
175-
q.push({i, j});
140+
queue<pair<int, int>> q;
141+
for (int i = 0; i < n; ++i) {
142+
for (int j = 0; j < n; ++j) {
143+
if (grid[i][j]) {
144+
q.emplace(i, j);
145+
}
146+
}
147+
}
176148
int ans = -1;
177-
bool valid = false;
178-
vector<int> dirs = {-1, 0, 1, 0, -1};
149+
if (q.empty() || q.size() == n * n) {
150+
return ans;
151+
}
152+
int dirs[5] = {-1, 0, 1, 0, -1};
179153
while (!q.empty()) {
180-
++ans;
181-
for (int k = q.size(); k > 0; --k) {
182-
pii p = q.front();
154+
for (int m = q.size(); m; --m) {
155+
auto [i, j] = q.front();
183156
q.pop();
184-
for (int i = 0; i < 4; ++i) {
185-
int x = p.first + dirs[i];
186-
int y = p.second + dirs[i + 1];
187-
if (x >= 0 && x < n && y >= 0 && y < n && grid[x][y] == 0) {
188-
valid = true;
157+
for (int k = 0; k < 4; ++k) {
158+
int x = i + dirs[k], y = j + dirs[k + 1];
159+
if (x >= 0 && x < n && y >= 0 && y < n && !grid[x][y]) {
189160
grid[x][y] = 1;
190-
q.push({x, y});
161+
q.emplace(x, y);
191162
}
192163
}
193164
}
165+
++ans;
194166
}
195-
return valid ? ans : -1;
167+
return ans;
196168
}
197169
};
198170
```
@@ -202,36 +174,70 @@ public:
202174
```go
203175
func maxDistance(grid [][]int) int {
204176
n := len(grid)
205-
var q [][]int
206-
for i := 0; i < n; i++ {
207-
for j := 0; j < n; j++ {
208-
if grid[i][j] == 1 {
209-
q = append(q, []int{i, j})
177+
q := [][2]int{}
178+
for i, row := range grid {
179+
for j, v := range row {
180+
if v == 1 {
181+
q = append(q, [2]int{i, j})
210182
}
211183
}
212184
}
213185
ans := -1
214-
valid := false
215-
dirs := []int{-1, 0, 1, 0, -1}
186+
if len(q) == 0 || len(q) == n*n {
187+
return ans
188+
}
189+
dirs := [5]int{-1, 0, 1, 0, -1}
216190
for len(q) > 0 {
217-
ans++
218-
for k := len(q); k > 0; k-- {
191+
for i := len(q); i > 0; i-- {
219192
p := q[0]
220193
q = q[1:]
221-
for i := 0; i < 4; i++ {
222-
x, y := p[0]+dirs[i], p[1]+dirs[i+1]
194+
for k := 0; k < 4; k++ {
195+
x, y := p[0]+dirs[k], p[1]+dirs[k+1]
223196
if x >= 0 && x < n && y >= 0 && y < n && grid[x][y] == 0 {
224-
valid = true
225197
grid[x][y] = 1
226-
q = append(q, []int{x, y})
198+
q = append(q, [2]int{x, y})
227199
}
228200
}
229201
}
202+
ans++
230203
}
231-
if valid {
232-
return ans
233-
}
234-
return -1
204+
return ans
205+
}
206+
```
207+
208+
### **TypeScript**
209+
210+
```ts
211+
function maxDistance(grid: number[][]): number {
212+
const n = grid.length;
213+
const q: [number, number][] = [];
214+
for (let i = 0; i < n; ++i) {
215+
for (let j = 0; j < n; ++j) {
216+
if (grid[i][j] === 1) {
217+
q.push([i, j]);
218+
}
219+
}
220+
}
221+
let ans = -1;
222+
if (q.length === 0 || q.length === n * n) {
223+
return ans;
224+
}
225+
const dirs: number[] = [-1, 0, 1, 0, -1];
226+
while (q.length > 0) {
227+
for (let m = q.length; m; --m) {
228+
const [i, j] = q.shift()!;
229+
for (let k = 0; k < 4; ++k) {
230+
const x = i + dirs[k];
231+
const y = j + dirs[k + 1];
232+
if (x >= 0 && x < n && y >= 0 && y < n && grid[x][y] === 0) {
233+
grid[x][y] = 1;
234+
q.push([x, y]);
235+
}
236+
}
237+
}
238+
++ans;
239+
}
240+
return ans;
235241
}
236242
```
237243

0 commit comments

Comments
 (0)