diff --git a/problems/0151.翻转字符串里的单词.md b/problems/0151.翻转字符串里的单词.md
index 0c1a526f..111c07e4 100644
--- a/problems/0151.翻转字符串里的单词.md
+++ b/problems/0151.翻转字符串里的单词.md
@@ -311,7 +311,7 @@ class Solution {
```
```java
-//解法三:双反转+移位,在原始数组上进行反转。空间复杂度O(1)
+//解法三:双反转+移位,String 的 toCharArray() 方法底层会 new 一个和原字符串相同大小的 char 数组,空间复杂度:O(n)
class Solution {
/**
* 思路:
diff --git a/problems/0200.岛屿数量.广搜版.md b/problems/0200.岛屿数量.广搜版.md
index 8bbedb59..e8ed60db 100644
--- a/problems/0200.岛屿数量.广搜版.md
+++ b/problems/0200.岛屿数量.广搜版.md
@@ -239,6 +239,42 @@ class Solution:
visited[next_i][next_j] = True
```
+### JavaScript
+```javascript
+var numIslands = function (grid) {
+ let dir = [[0, 1], [1, 0], [-1, 0], [0, -1]]; // 四个方向
+ let bfs = (grid, visited, x, y) => {
+ let queue = [];
+ queue.push([x, y]);
+ visited[x][y] = true;
+ while (queue.length) {
+ let top = queue.shift();//取出队列头部元素
+ console.log(top)
+ for (let i = 0; i < 4; i++) {
+ let nextX = top[0] + dir[i][0]
+ let nextY = top[1] + dir[i][1]
+ if (nextX < 0 || nextX >= grid.length || nextY < 0 || nextY >= grid[0].length)
+ continue;
+ if (!visited[nextX][nextY] && grid[nextX][nextY] === "1") {
+ queue.push([nextX, nextY])
+ visited[nextX][nextY] = true
+ }
+ }
+ }
+ }
+ let visited = new Array(grid.length).fill().map(() => Array(grid[0].length).fill(false))
+ let res = 0
+ for (let i = 0; i < grid.length; i++) {
+ for (let j = 0; j < grid[i].length; j++) {
+ if (!visited[i][j] && grid[i][j] === "1") {
+ ++res;
+ bfs(grid, visited, i, j);
+ }
+ }
+ }
+ return res
+};
+```
### Rust
diff --git a/problems/0200.岛屿数量.深搜版.md b/problems/0200.岛屿数量.深搜版.md
index 905c0979..c7649971 100644
--- a/problems/0200.岛屿数量.深搜版.md
+++ b/problems/0200.岛屿数量.深搜版.md
@@ -219,7 +219,7 @@ class Solution {
}
```
-Python:
+### Python:
```python
# 版本一
@@ -278,8 +278,91 @@ class Solution:
return result
```
+### JavaScript
-Rust:
+```javascript
+var numIslands = function (grid) {
+ let dir = [[0, 1], [1, 0], [-1, 0], [0, -1]]; // 四个方向
+
+ let dfs = (grid, visited, x, y) => {
+ for (let i = 0; i < 4; i++) {
+ let nextX = x + dir[i][0]
+ let nextY = y + dir[i][1]
+ if (nextX < 0 || nextX >= grid.length || nextY < 0 || nextY >= grid[0].length)
+ continue;
+ if (!visited[nextX][nextY] && grid[nextX][nextY] === "1") {
+ visited[nextX][nextY] = true
+ dfs(grid,visited,nextX,nextY)
+ }
+ }
+ }
+ let visited = new Array(grid.length).fill().map(() => Array(grid[0].length).fill(false))
+
+ let res = 0
+ for (let i = 0; i < grid.length; i++) {
+ for (let j = 0; j < grid[i].length; j++) {
+ if (!visited[i][j] && grid[i][j] === "1") {
+ ++res;
+ visited[i][j] = true;
+ dfs(grid, visited, i, j);
+ }
+ }
+ }
+ return res
+};
+```
+
+### Go
+
+```go
+func numIslands(grid [][]byte) int {
+ // 用1标记已访问
+ visited := make([][]int, len(grid))
+ for i := 0; i < len(visited); i++{
+ visited[i] = make([]int, len(grid[0]))
+ }
+
+ var bfs func(x, y int)
+ bfs = func(x, y int){
+ stack := make([][]int, 0)
+ stack = append(stack, []int{x, y})
+ moveX := []int{1, -1, 0, 0}
+ moveY := []int{0, 0, 1, -1}
+
+ for len(stack) != 0{
+ node := stack[len(stack) - 1]
+ stack = stack[:len(stack) - 1]
+
+ for i := 0; i < 4; i++{
+ dx := moveX[i] + node[0]
+ dy := moveY[i] + node[1]
+ if dx < 0 || dx >= len(grid) || dy < 0 || dy >= len(grid[0]) || visited[dx][dy] == 1{
+ continue
+ }
+ visited[dx][dy] = 1
+ if grid[dx][dy] == '1'{
+ stack = append(stack, []int{dx,dy})
+ }
+ }
+ }
+ }
+
+ result := 0
+ for i := 0; i < len(grid); i++{
+ for j := 0; j < len(grid[0]); j++{
+ if visited[i][j] == 0 && grid[i][j] == '1'{
+ bfs(i, j)
+ visited[i][j] = 1
+ result++
+ }
+ }
+ }
+
+ return result
+}
+```
+
+### Rust:
```rust
diff --git a/problems/0225.用队列实现栈.md b/problems/0225.用队列实现栈.md
index 3de300c7..d89bf44b 100644
--- a/problems/0225.用队列实现栈.md
+++ b/problems/0225.用队列实现栈.md
@@ -454,13 +454,34 @@ class MyStack:
def top(self) -> int:
"""
+ 写法一:
1. 首先确认不空
- 2. 我们仅有in会存放数据,所以返回第一个即可
+ 2. 我们仅有in会存放数据,所以返回第一个即可(这里实际上用到了栈)
+ 写法二:
+ 1. 首先确认不空
+ 2. 因为队列的特殊性,FIFO,所以我们只有在pop()的时候才会使用queue_out
+ 3. 先把queue_in中的所有元素(除了最后一个),依次出列放进queue_out
+ 4. 交换in和out,此时out里只有一个元素
+ 5. 把out中的pop出来,即是原队列的最后一个,并使用temp变量暂存
+ 6. 把temp追加到queue_in的末尾
"""
+ # 写法一:
+ # if self.empty():
+ # return None
+
+ # return self.queue_in[-1] # 这里实际上用到了栈,因为直接获取了queue_in的末尾元素
+
+ # 写法二:
if self.empty():
return None
+
+ for i in range(len(self.queue_in) - 1):
+ self.queue_out.append(self.queue_in.popleft())
- return self.queue_in[-1]
+ self.queue_in, self.queue_out = self.queue_out, self.queue_in
+ temp = self.queue_out.popleft()
+ self.queue_in.append(temp)
+ return temp
def empty(self) -> bool:
@@ -488,9 +509,19 @@ class MyStack:
return self.que.popleft()
def top(self) -> int:
+ # 写法一:
+ # if self.empty():
+ # return None
+ # return self.que[-1]
+
+ # 写法二:
if self.empty():
return None
- return self.que[-1]
+ for i in range(len(self.que)-1):
+ self.que.append(self.que.popleft())
+ temp = self.que.popleft()
+ self.que.append(temp)
+ return temp
def empty(self) -> bool:
return not self.que
diff --git a/problems/0695.岛屿的最大面积.md b/problems/0695.岛屿的最大面积.md
index 3dd181a3..74470ae5 100644
--- a/problems/0695.岛屿的最大面积.md
+++ b/problems/0695.岛屿的最大面积.md
@@ -391,6 +391,44 @@ class Solution:
self.dfs(grid, visited, new_x, new_y)
```
+### JavaScript
+```javascript
+var maxAreaOfIsland = function (grid) {
+ let dir = [[0, 1], [1, 0], [-1, 0], [0, -1]]; // 四个方向
+
+ let visited = new Array(grid.length).fill().map(() => Array(grid[0].length).fill(false))
+
+ let dfs = (grid, visited, x, y, m) => {
+ for (let i = 0; i < 4; i++) {
+ let nextX = x + dir[i][0]
+ let nextY = y + dir[i][1]
+ if (nextX < 0 || nextX >= grid.length || nextY < 0 || nextY >= grid[0].length)
+ continue;
+ if (!visited[nextX][nextY] && grid[nextX][nextY] === 1) {
+ visited[nextX][nextY] = true
+ m = dfs(grid, visited, nextX, nextY,m+1)
+ }
+ }
+ return m
+ }
+
+ let max = 0
+
+ for (let i = 0; i < grid.length; i++) {
+ for (let j = 0; j < grid[i].length; j++) {
+ if (!visited[i][j] && grid[i][j] === 1) {
+ // 深度优先
+ visited[i][j] = true;
+ let m = dfs(grid, visited, i, j, 1);
+ if (m > max) max = m;
+ }
+ }
+ }
+ return max
+};
+```
+
+
### Rust
dfs: 版本一
@@ -530,7 +568,6 @@ impl Solution {
}
}
```
-
diff --git a/problems/0797.所有可能的路径.md b/problems/0797.所有可能的路径.md
index 9d14bd7c..bcce9314 100644
--- a/problems/0797.所有可能的路径.md
+++ b/problems/0797.所有可能的路径.md
@@ -217,8 +217,61 @@ class Solution:
self.path.pop() # 回溯
```
+
+### JavaScript
+```javascript
+var allPathsSourceTarget = function(graph) {
+ let res=[],path=[]
+
+ function dfs(graph,start){
+ if(start===graph.length-1){
+ res.push([...path])
+ return;
+ }
+ for(let i=0;i>) -> Vec> {
diff --git a/problems/剑指Offer58-II.左旋转字符串.md b/problems/剑指Offer58-II.左旋转字符串.md
index 82a968d4..43a0fe08 100644
--- a/problems/剑指Offer58-II.左旋转字符串.md
+++ b/problems/剑指Offer58-II.左旋转字符串.md
@@ -120,8 +120,9 @@ class Solution {
```
```java
-//解法二:空间复杂度:O(1)。用原始数组来进行反转操作
-//思路为:先整个字符串反转,再反转前面的,最后反转后面 n 个
+// 解法二
+// 空间复杂度:O(n)。String 的 toCharArray() 方法底层会 new 一个和原字符串相同大小的 char 数组
+// 思路为:先整个字符串反转,再反转前面的,最后反转后面 n 个
class Solution {
public String reverseLeftWords(String s, int n) {
char[] chars = s.toCharArray();