Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit be3f885

Browse files
Merge branch 'youngyangyang04:master' into master
2 parents 7ac6785 + 110823c commit be3f885

File tree

4 files changed

+169
-24
lines changed

4 files changed

+169
-24
lines changed

‎problems/0200.岛屿数量.深搜版.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737

3838
在遇到标记过的陆地节点和海洋节点的时候直接跳过。 这样计数器就是最终岛屿的数量。
3939

40-
那么如果把节点陆地所能遍历到的陆地都标记上呢,就可以使用 DFS,BFS或者并查集。
40+
那么如何把节点陆地所能遍历到的陆地都标记上呢,就可以使用 DFS,BFS或者并查集。
4141

4242
### 深度优先搜索
4343

‎problems/0647.回文子串.md‎

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,7 @@ class Solution:
397397
```
398398
399399
### Go:
400+
> 动态规划:
400401
401402
```Go
402403
func countSubstrings(s string) int {
@@ -422,6 +423,47 @@ func countSubstrings(s string) int {
422423
return res
423424
}
424425
```
426+
> 动态规划:简洁版
427+
```Go
428+
func countSubstrings(s string) int {
429+
res := 0
430+
dp := make([][]bool, len(s))
431+
for i := 0; i < len(s); i++ {
432+
dp[i] = make([]bool, len(s))
433+
}
434+
435+
for i := len(s) - 1; i >= 0; i-- {
436+
for j := i; j < len(s); j++ {
437+
if s[i] == s[j] && (j-i <= 1 || dp[i+1][j-1]) {
438+
res++
439+
dp[i][j] = true
440+
}
441+
}
442+
}
443+
return res
444+
}
445+
```
446+
447+
> 双指针法:
448+
```Go
449+
func countSubstrings(s string) int {
450+
extend := func(i, j int) int {
451+
res := 0
452+
for i >= 0 && j < len(s) && s[i] == s[j] {
453+
i --
454+
j ++
455+
res ++
456+
}
457+
return res
458+
}
459+
res := 0
460+
for i := 0; i < len(s); i++ {
461+
res += extend(i, i) // 以i为中心
462+
res += extend(i, i+1) // 以i和i+1为中心
463+
}
464+
return res
465+
}
466+
```
425467

426468
### Javascript:
427469

‎problems/0827.最大人工岛.md‎

Lines changed: 93 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,99 @@ class Solution:
348348

349349
```
350350

351+
352+
### Go
353+
354+
```go
355+
func largestIsland(grid [][]int) int {
356+
dir := [][]int{{0, 1}, {1, 0}, {-1, 0}, {0, -1}}
357+
n := len(grid)
358+
m := len(grid[0])
359+
area := 0
360+
visited := make([][]bool, n)
361+
for i := 0; i < n; i++ {
362+
visited[i] = make([]bool, m)
363+
}
364+
gridNum := make(map[int]int, 0) // 记录每一个岛屿的面积
365+
mark := 2 // 记录每个岛屿的编号
366+
isAllGrid := true
367+
res := 0 // 标记是否整个地图都是陆地
368+
369+
var dfs func(grid [][]int, visited [][]bool, x, y, mark int)
370+
dfs = func(grid [][]int, visited [][]bool, x, y, mark int) {
371+
// 终止条件:访问过的节点 或者 遇到海水
372+
if visited[x][y] || grid[x][y] == 0 {
373+
return
374+
}
375+
visited[x][y] = true // 标记访问过
376+
grid[x][y] = mark // 给陆地标记新标签
377+
area++
378+
for i := 0; i < 4; i++ {
379+
nextX := x + dir[i][0]
380+
nextY := y + dir[i][1]
381+
if nextX < 0 || nextX >= len(grid) || nextY < 0 || nextY >= len(grid[0]) {
382+
continue
383+
}
384+
dfs(grid, visited, nextX, nextY, mark)
385+
}
386+
}
387+
388+
for i := 0; i < n; i++ {
389+
for j := 0; j < m; j++ {
390+
if grid[i][j] == 0 {
391+
isAllGrid = false
392+
}
393+
if !visited[i][j] && grid[i][j] == 1 {
394+
area = 0
395+
dfs(grid, visited, i, j, mark) // 将与其链接的陆地都标记上 true
396+
gridNum[mark] = area // 记录每一个岛屿的面积
397+
mark++ // 更新下一个岛屿编号
398+
}
399+
}
400+
}
401+
if isAllGrid {
402+
return n * m
403+
}
404+
// 根据添加陆地的位置,计算周边岛屿面积之和
405+
visitedGrid := make(map[int]struct{}) // 标记访问过的岛屿
406+
for i := 0; i < n; i++ {
407+
for j := 0; j < m; j++ {
408+
count := 1 // 记录连接之后的岛屿数量
409+
visitedGrid = make(map[int]struct{}) // 每次使用时,清空
410+
if grid[i][j] == 0 {
411+
for k := 0; k < 4; k++ {
412+
// 计算相邻坐标
413+
nearI := i + dir[k][0]
414+
nearJ := j + dir[k][1]
415+
if nearI < 0 || nearI >= len(grid) || nearJ < 0 || nearJ >= len(grid[0]) {
416+
continue
417+
}
418+
// 添加过的岛屿不要重复添加
419+
if _, ok := visitedGrid[grid[nearI][nearJ]]; ok {
420+
continue
421+
}
422+
// 把相邻四面的岛屿数量加起来
423+
count += gridNum[grid[nearI][nearJ]]
424+
// 标记该岛屿已经添加过
425+
visitedGrid[grid[nearI][nearJ]] = struct{}{}
426+
}
427+
}
428+
res = max827(res, count)
429+
}
430+
}
431+
return res
432+
}
433+
434+
func max827(x, y int) int {
435+
if x > y {
436+
return x
437+
}
438+
return y
439+
}
440+
441+
```
442+
443+
351444
### JavaScript
352445

353446
```JavaScript
@@ -411,8 +504,6 @@ return res;
411504
```
412505

413506

414-
415-
416507
<p align="center">
417508
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
418509
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>

‎problems/二叉树的递归遍历.md‎

Lines changed: 33 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -180,40 +180,52 @@ class Solution {
180180

181181
class Solution:
182182
def preorderTraversal(self, root: TreeNode) -> List[int]:
183-
if not root:
184-
return []
185-
186-
left = self.preorderTraversal(root.left)
187-
right = self.preorderTraversal(root.right)
188-
189-
return [root.val] + left + right
183+
res = []
184+
185+
def dfs(node):
186+
if node is None:
187+
return
188+
189+
res.append(node.val)
190+
dfs(node.left)
191+
dfs(node.right)
192+
193+
return res
190194

191195
```
192196
```python
193197
# 中序遍历-递归-LC94_二叉树的中序遍历
194198
class Solution:
195199
def inorderTraversal(self, root: TreeNode) -> List[int]:
196-
if root is None:
197-
return []
198-
199-
left = self.inorderTraversal(root.left)
200-
right = self.inorderTraversal(root.right)
201-
202-
return left + [root.val] + right
200+
res = []
201+
202+
def dfs(node):
203+
if node is None:
204+
return
205+
206+
dfs(node.left)
207+
res.append(node.val)
208+
dfs(node.right)
209+
210+
return res
203211
```
204212
```python
205213

206214

207215
# 后序遍历-递归-LC145_二叉树的后序遍历
208216
class Solution:
209217
def postorderTraversal(self, root: TreeNode) -> List[int]:
210-
if not root:
211-
return []
212-
213-
left = self.postorderTraversal(root.left)
214-
right = self.postorderTraversal(root.right)
215-
216-
return left + right + [root.val]
218+
res = []
219+
220+
def dfs(node):
221+
if node is None:
222+
return
223+
224+
dfs(node.left)
225+
dfs(node.right)
226+
res.append(node.val)
227+
228+
return res
217229
```
218230

219231
### Go:

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /