Skip to content

Commit 06e5f78

Browse files
committedMar 20, 2023
feat: update solutions to lc problem: No.1306
No.1306.Jump Game III
1 parent 34c9441 commit 06e5f78

File tree

6 files changed

+76
-57
lines changed

6 files changed

+76
-57
lines changed
 

Diff for: ‎solution/1300-1399/1306.Jump Game III/README.md

+33-20
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,17 @@
5454

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

57-
BFS。
57+
**方法一:BFS**
58+
59+
我们可以使用 BFS 来判断是否能够到达值为 $0$ 的下标。
60+
61+
定义一个队列 $q$,用于存储当前能够到达的下标。初始时,将 $start$ 下标入队。
62+
63+
当队列不为空时,取出队首下标 $i$,如果 $arr[i] = 0$,则返回 `true`。否则,我们将下标 $i$ 标记为已访问,如果 $i + arr[i]$ 和 $i - arr[i]$ 在数组范围内且未被访问过,则将其入队,继续搜索。
64+
65+
最后,如果队列为空,说明无法到达值为 $0$ 的下标,返回 `false`
66+
67+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为数组长度。
5868

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

@@ -65,16 +75,16 @@ BFS。
6575
```python
6676
class Solution:
6777
def canReach(self, arr: List[int], start: int) -> bool:
68-
n = len(arr)
6978
q = deque([start])
7079
while q:
7180
i = q.popleft()
7281
if arr[i] == 0:
7382
return True
74-
for j in [i + arr[i], i - arr[i]]:
75-
if 0 <= j < n and arr[j] >= 0:
76-
q.append(j)
83+
x = arr[i]
7784
arr[i] = -1
85+
for j in (i + x, i - x):
86+
if 0 <= j < len(arr) and arr[j] >= 0:
87+
q.append(j)
7888
return False
7989
```
8090

@@ -85,20 +95,20 @@ class Solution:
8595
```java
8696
class Solution {
8797
public boolean canReach(int[] arr, int start) {
88-
int n = arr.length;
8998
Deque<Integer> q = new ArrayDeque<>();
9099
q.offer(start);
91100
while (!q.isEmpty()) {
92101
int i = q.poll();
93102
if (arr[i] == 0) {
94103
return true;
95104
}
96-
for (int j : Arrays.asList(i + arr[i], i - arr[i])) {
97-
if (j >= 0 && j < n && arr[j] >= 0) {
105+
int x = arr[i];
106+
arr[i] = -1;
107+
for (int j : List.of(i + x, i - x)) {
108+
if (j >= 0 && j < arr.length && arr[j] >= 0) {
98109
q.offer(j);
99110
}
100111
}
101-
arr[i] = -1;
102112
}
103113
return false;
104114
}
@@ -111,20 +121,22 @@ class Solution {
111121
class Solution {
112122
public:
113123
bool canReach(vector<int>& arr, int start) {
114-
int n = arr.size();
115-
queue<int> q {{start}};
124+
queue<int> q{{start}};
116125
while (!q.empty()) {
117126
int i = q.front();
118-
if (arr[i] == 0)
119-
return 1;
120127
q.pop();
121-
for (int j : {i + arr[i], i - arr[i]}) {
122-
if (j >= 0 && j < n && arr[j] >= 0)
123-
q.push(j);
128+
if (arr[i] == 0) {
129+
return true;
124130
}
131+
int x = arr[i];
125132
arr[i] = -1;
133+
for (int j : {i + x, i - x}) {
134+
if (j >= 0 && j < arr.size() && ~arr[j]) {
135+
q.push(j);
136+
}
137+
}
126138
}
127-
return 0;
139+
return false;
128140
}
129141
};
130142
```
@@ -136,16 +148,17 @@ func canReach(arr []int, start int) bool {
136148
q := []int{start}
137149
for len(q) > 0 {
138150
i := q[0]
151+
q = q[1:]
139152
if arr[i] == 0 {
140153
return true
141154
}
142-
q = q[1:]
143-
for _, j := range []int{i + arr[i], i - arr[i]} {
155+
x := arr[i]
156+
arr[i] = -1
157+
for _, j := range []int{i + x, i - x} {
144158
if j >= 0 && j < len(arr) && arr[j] >= 0 {
145159
q = append(q, j)
146160
}
147161
}
148-
arr[i] = -1
149162
}
150163
return false
151164
}

Diff for: ‎solution/1300-1399/1306.Jump Game III/README_EN.md

+22-19
Original file line numberDiff line numberDiff line change
@@ -58,16 +58,16 @@ BFS.
5858
```python
5959
class Solution:
6060
def canReach(self, arr: List[int], start: int) -> bool:
61-
n = len(arr)
6261
q = deque([start])
6362
while q:
6463
i = q.popleft()
6564
if arr[i] == 0:
6665
return True
67-
for j in [i + arr[i], i - arr[i]]:
68-
if 0 <= j < n and arr[j] >= 0:
69-
q.append(j)
66+
x = arr[i]
7067
arr[i] = -1
68+
for j in (i + x, i - x):
69+
if 0 <= j < len(arr) and arr[j] >= 0:
70+
q.append(j)
7171
return False
7272
```
7373

@@ -76,20 +76,20 @@ class Solution:
7676
```java
7777
class Solution {
7878
public boolean canReach(int[] arr, int start) {
79-
int n = arr.length;
8079
Deque<Integer> q = new ArrayDeque<>();
8180
q.offer(start);
8281
while (!q.isEmpty()) {
8382
int i = q.poll();
8483
if (arr[i] == 0) {
8584
return true;
8685
}
87-
for (int j : Arrays.asList(i + arr[i], i - arr[i])) {
88-
if (j >= 0 && j < n && arr[j] >= 0) {
86+
int x = arr[i];
87+
arr[i] = -1;
88+
for (int j : List.of(i + x, i - x)) {
89+
if (j >= 0 && j < arr.length && arr[j] >= 0) {
8990
q.offer(j);
9091
}
9192
}
92-
arr[i] = -1;
9393
}
9494
return false;
9595
}
@@ -102,20 +102,22 @@ class Solution {
102102
class Solution {
103103
public:
104104
bool canReach(vector<int>& arr, int start) {
105-
int n = arr.size();
106-
queue<int> q {{start}};
105+
queue<int> q{{start}};
107106
while (!q.empty()) {
108107
int i = q.front();
109-
if (arr[i] == 0)
110-
return 1;
111108
q.pop();
112-
for (int j : {i + arr[i], i - arr[i]}) {
113-
if (j >= 0 && j < n && arr[j] >= 0)
114-
q.push(j);
109+
if (arr[i] == 0) {
110+
return true;
115111
}
112+
int x = arr[i];
116113
arr[i] = -1;
114+
for (int j : {i + x, i - x}) {
115+
if (j >= 0 && j < arr.size() && ~arr[j]) {
116+
q.push(j);
117+
}
118+
}
117119
}
118-
return 0;
120+
return false;
119121
}
120122
};
121123
```
@@ -127,16 +129,17 @@ func canReach(arr []int, start int) bool {
127129
q := []int{start}
128130
for len(q) > 0 {
129131
i := q[0]
132+
q = q[1:]
130133
if arr[i] == 0 {
131134
return true
132135
}
133-
q = q[1:]
134-
for _, j := range []int{i + arr[i], i - arr[i]} {
136+
x := arr[i]
137+
arr[i] = -1
138+
for _, j := range []int{i + x, i - x} {
135139
if j >= 0 && j < len(arr) && arr[j] >= 0 {
136140
q = append(q, j)
137141
}
138142
}
139-
arr[i] = -1
140143
}
141144
return false
142145
}

Diff for: ‎solution/1300-1399/1306.Jump Game III/Solution.cpp

+9-7
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
11
class Solution {
22
public:
33
bool canReach(vector<int>& arr, int start) {
4-
int n = arr.size();
54
queue<int> q{{start}};
65
while (!q.empty()) {
76
int i = q.front();
8-
if (arr[i] == 0)
9-
return 1;
107
q.pop();
11-
for (int j : {i + arr[i], i - arr[i]}) {
12-
if (j >= 0 && j < n && arr[j] >= 0)
13-
q.push(j);
8+
if (arr[i] == 0) {
9+
return true;
1410
}
11+
int x = arr[i];
1512
arr[i] = -1;
13+
for (int j : {i + x, i - x}) {
14+
if (j >= 0 && j < arr.size() && ~arr[j]) {
15+
q.push(j);
16+
}
17+
}
1618
}
17-
return 0;
19+
return false;
1820
}
1921
};

Diff for: ‎solution/1300-1399/1306.Jump Game III/Solution.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,17 @@ func canReach(arr []int, start int) bool {
22
q := []int{start}
33
for len(q) > 0 {
44
i := q[0]
5+
q = q[1:]
56
if arr[i] == 0 {
67
return true
78
}
8-
q = q[1:]
9-
for _, j := range []int{i + arr[i], i - arr[i]} {
9+
x := arr[i]
10+
arr[i] = -1
11+
for _, j := range []int{i + x, i - x} {
1012
if j >= 0 && j < len(arr) && arr[j] >= 0 {
1113
q = append(q, j)
1214
}
1315
}
14-
arr[i] = -1
1516
}
1617
return false
1718
}

Diff for: ‎solution/1300-1399/1306.Jump Game III/Solution.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
class Solution {
22
public boolean canReach(int[] arr, int start) {
3-
int n = arr.length;
43
Deque<Integer> q = new ArrayDeque<>();
54
q.offer(start);
65
while (!q.isEmpty()) {
76
int i = q.poll();
87
if (arr[i] == 0) {
98
return true;
109
}
11-
for (int j : Arrays.asList(i + arr[i], i - arr[i])) {
12-
if (j >= 0 && j < n && arr[j] >= 0) {
10+
int x = arr[i];
11+
arr[i] = -1;
12+
for (int j : List.of(i + x, i - x)) {
13+
if (j >= 0 && j < arr.length && arr[j] >= 0) {
1314
q.offer(j);
1415
}
1516
}
16-
arr[i] = -1;
1717
}
1818
return false;
1919
}

Diff for: ‎solution/1300-1399/1306.Jump Game III/Solution.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
class Solution:
22
def canReach(self, arr: List[int], start: int) -> bool:
3-
n = len(arr)
43
q = deque([start])
54
while q:
65
i = q.popleft()
76
if arr[i] == 0:
87
return True
9-
for j in [i + arr[i], i - arr[i]]:
10-
if 0 <= j < n and arr[j] >= 0:
11-
q.append(j)
8+
x = arr[i]
129
arr[i] = -1
10+
for j in (i + x, i - x):
11+
if 0 <= j < len(arr) and arr[j] >= 0:
12+
q.append(j)
1313
return False

0 commit comments

Comments
 (0)