Skip to content

Commit c58d698

Browse files
committed
feat: add solutions to lc problem: No.1824
No.1824.Minimum Sideway Jumps
1 parent 17f6641 commit c58d698

File tree

7 files changed

+191
-155
lines changed

7 files changed

+191
-155
lines changed

solution/1800-1899/1824.Minimum Sideway Jumps/README.md

Lines changed: 68 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -68,17 +68,13 @@
6868

6969
**方法一:动态规划**
7070

71-
我们用 $f[i][j]$ 表示从起点跳到第 $i$ 个点,且当前在第 $j$ 条跑道的最少侧跳次数。注意到每个位置 $i$ 只依赖于 $i - 1$ 位置,因此我们可以使用滚动数组优化空间复杂度。
71+
我们定义 $f[i][j]$ 表示青蛙到达第 $i$ 个点,且处于第 $j$ 条跑道(下标从 $0$ 开始)的最小侧跳次数。注意到青蛙起始位置处于第 $2$ 条跑道(题目这里下标从 $1$ 开始),因此 $f[0][1]$ 的值为 $0$,其余位置的值均为正无穷。答案为 $min(f[n][0], f[n][1], f[n][2])$
7272

73-
定义 $f[j]$ 表示从起点跳到第 $i$ 个点,且当前在第 $j$ 条跑道的最少侧跳次数。答案即为 $min(f[0], f[1], f[2])$。
73+
对于 $i$ 从 $1$ 到 $n$ 的每个位置,我们可以枚举青蛙当前所处的跑道 $j$,如果 $obstacles[i] = j + 1$,说明第 $j$ 条跑道上有障碍,此时 $f[i][j]$ 的值为正无穷;否则,青蛙可以选择不跳跃,此时 $f[i][j]$ 的值为 $f[i - 1][j]$,或者青蛙可以从其它跑道侧跳过来,此时 $f[i][j] = min(f[i][j], min(f[i][0], f[i][1], f[i][2]) + 1)$。
7474

75-
我们可以枚举当前点的三条跑道,如果当前跑道没有障碍,那么 $f[j]$ 不变,否则 $f[j]$ 为其它两条跑道中的最小值加 $1$
75+
注意到第 $i$ 个点的侧跳次数只与第 $i - 1$ 个点有关,因此,我们可以将第一维空间优化掉,只用一个长度为 $3$ 的数组 $f$ 来维护
7676

77-
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组 `obstacles` 的长度。
78-
79-
相似题目:
80-
81-
- [221028 天池-03. 小鸡酷跑](https://leetcode.cn/problems/FJxjiD/solution/by-lcbin-rum4/)
77+
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组 $obstacles$ 的长度。
8278

8379
<!-- tabs:start -->
8480

@@ -91,17 +87,14 @@ class Solution:
9187
def minSideJumps(self, obstacles: List[int]) -> int:
9288
f = [1, 0, 1]
9389
for v in obstacles[1:]:
94-
g = [inf] * 3
90+
for j in range(3):
91+
if v == j + 1:
92+
f[j] = inf
93+
break
94+
x = min(f) + 1
9595
for j in range(3):
9696
if v != j + 1:
97-
g[j] = f[j]
98-
if v != 1:
99-
g[0] = min(g[0], min(g[1], g[2]) + 1)
100-
if v != 2:
101-
g[1] = min(g[1], min(g[0], g[2]) + 1)
102-
if v != 3:
103-
g[2] = min(g[2], min(g[0], g[1]) + 1)
104-
f = g
97+
f[j] = min(f[j], x)
10598
return min(f)
10699
```
107100

@@ -111,28 +104,22 @@ class Solution:
111104

112105
```java
113106
class Solution {
114-
private int inf = 0x3f3f3f3f;
115-
116107
public int minSideJumps(int[] obstacles) {
117-
int[] f = new int[] {1, 0, 1};
108+
final int inf = 1 << 30;
109+
int[] f = {1, 0, 1};
118110
for (int i = 1; i < obstacles.length; ++i) {
119-
int v = obstacles[i];
120-
int[] g = new int[] {inf, inf, inf};
121111
for (int j = 0; j < 3; ++j) {
122-
if (v != j + 1) {
123-
g[j] = f[j];
112+
if (obstacles[i] == j + 1) {
113+
f[j] = inf;
114+
break;
124115
}
125116
}
126-
if (v != 1) {
127-
g[0] = Math.min(g[0], Math.min(g[1], g[2]) + 1);
128-
}
129-
if (v != 2) {
130-
g[1] = Math.min(g[1], Math.min(g[0], g[2]) + 1);
131-
}
132-
if (v != 3) {
133-
g[2] = Math.min(g[2], Math.min(g[0], g[1]) + 1);
117+
int x = Math.min(f[0], Math.min(f[1], f[2])) + 1;
118+
for (int j = 0; j < 3; ++j) {
119+
if (obstacles[i] != j + 1) {
120+
f[j] = Math.min(f[j], x);
121+
}
134122
}
135-
f = g;
136123
}
137124
return Math.min(f[0], Math.min(f[1], f[2]));
138125
}
@@ -144,20 +131,24 @@ class Solution {
144131
```cpp
145132
class Solution {
146133
public:
147-
const int inf = 0x3f3f3f3f;
148-
149134
int minSideJumps(vector<int>& obstacles) {
150-
vector<int> f = {1, 0, 1};
135+
const int inf = 1 << 30;
136+
int f[3] = {1, 0, 1};
151137
for (int i = 1; i < obstacles.size(); ++i) {
152-
int v = obstacles[i];
153-
vector<int> g(3, inf);
154-
for (int j = 0; j < 3; ++j) if (v != j + 1) g[j] = f[j];
155-
if (v != 1) g[0] = min(g[0], min(g[1], g[2]) + 1);
156-
if (v != 2) g[1] = min(g[1], min(g[0], g[2]) + 1);
157-
if (v != 3) g[2] = min(g[2], min(g[0], g[1]) + 1);
158-
f = move(g);
138+
for (int j = 0; j < 3; ++j) {
139+
if (obstacles[i] == j + 1) {
140+
f[j] = inf;
141+
break;
142+
}
143+
}
144+
int x = min({f[0], f[1], f[2]}) + 1;
145+
for (int j = 0; j < 3; ++j) {
146+
if (obstacles[i] != j + 1) {
147+
f[j] = min(f[j], x);
148+
}
149+
}
159150
}
160-
return *min_element(f.begin(), f.end());
151+
return min({f[0], f[1], f[2]});
161152
}
162153
};
163154
```
@@ -166,25 +157,21 @@ public:
166157
167158
```go
168159
func minSideJumps(obstacles []int) int {
169-
inf := 0x3f3f3f3f
170160
f := [3]int{1, 0, 1}
161+
const inf = 1 << 30
171162
for _, v := range obstacles[1:] {
172-
g := [3]int{inf, inf, inf}
173163
for j := 0; j < 3; j++ {
174-
if v != j+1 {
175-
g[j] = f[j]
164+
if v == j+1 {
165+
f[j] = inf
166+
break
176167
}
177168
}
178-
if v != 1 {
179-
g[0] = min(g[0], min(g[1], g[2])+1)
180-
}
181-
if v != 2 {
182-
g[1] = min(g[1], min(g[0], g[2])+1)
183-
}
184-
if v != 3 {
185-
g[2] = min(g[2], min(g[0], g[1])+1)
169+
x := min(f[0], min(f[1], f[2])) + 1
170+
for j := 0; j < 3; j++ {
171+
if v != j+1 {
172+
f[j] = min(f[j], x)
173+
}
186174
}
187-
f = g
188175
}
189176
return min(f[0], min(f[1], f[2]))
190177
}
@@ -197,6 +184,30 @@ func min(a, b int) int {
197184
}
198185
```
199186

187+
### **TypeScript**
188+
189+
```ts
190+
function minSideJumps(obstacles: number[]): number {
191+
const inf = 1 << 30;
192+
const f = [1, 0, 1];
193+
for (let i = 1; i < obstacles.length; ++i) {
194+
for (let j = 0; j < 3; ++j) {
195+
if (obstacles[i] == j + 1) {
196+
f[j] = inf;
197+
break;
198+
}
199+
}
200+
const x = Math.min(...f) + 1;
201+
for (let j = 0; j < 3; ++j) {
202+
if (obstacles[i] != j + 1) {
203+
f[j] = Math.min(f[j], x);
204+
}
205+
}
206+
}
207+
return Math.min(...f);
208+
}
209+
```
210+
200211
### **...**
201212

202213
```

solution/1800-1899/1824.Minimum Sideway Jumps/README_EN.md

Lines changed: 64 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -69,46 +69,37 @@ class Solution:
6969
def minSideJumps(self, obstacles: List[int]) -> int:
7070
f = [1, 0, 1]
7171
for v in obstacles[1:]:
72-
g = [inf] * 3
72+
for j in range(3):
73+
if v == j + 1:
74+
f[j] = inf
75+
break
76+
x = min(f) + 1
7377
for j in range(3):
7478
if v != j + 1:
75-
g[j] = f[j]
76-
if v != 1:
77-
g[0] = min(g[0], min(g[1], g[2]) + 1)
78-
if v != 2:
79-
g[1] = min(g[1], min(g[0], g[2]) + 1)
80-
if v != 3:
81-
g[2] = min(g[2], min(g[0], g[1]) + 1)
82-
f = g
79+
f[j] = min(f[j], x)
8380
return min(f)
8481
```
8582

8683
### **Java**
8784

8885
```java
8986
class Solution {
90-
private int inf = 0x3f3f3f3f;
91-
9287
public int minSideJumps(int[] obstacles) {
93-
int[] f = new int[] {1, 0, 1};
88+
final int inf = 1 << 30;
89+
int[] f = {1, 0, 1};
9490
for (int i = 1; i < obstacles.length; ++i) {
95-
int v = obstacles[i];
96-
int[] g = new int[] {inf, inf, inf};
9791
for (int j = 0; j < 3; ++j) {
98-
if (v != j + 1) {
99-
g[j] = f[j];
92+
if (obstacles[i] == j + 1) {
93+
f[j] = inf;
94+
break;
10095
}
10196
}
102-
if (v != 1) {
103-
g[0] = Math.min(g[0], Math.min(g[1], g[2]) + 1);
104-
}
105-
if (v != 2) {
106-
g[1] = Math.min(g[1], Math.min(g[0], g[2]) + 1);
107-
}
108-
if (v != 3) {
109-
g[2] = Math.min(g[2], Math.min(g[0], g[1]) + 1);
97+
int x = Math.min(f[0], Math.min(f[1], f[2])) + 1;
98+
for (int j = 0; j < 3; ++j) {
99+
if (obstacles[i] != j + 1) {
100+
f[j] = Math.min(f[j], x);
101+
}
110102
}
111-
f = g;
112103
}
113104
return Math.min(f[0], Math.min(f[1], f[2]));
114105
}
@@ -120,20 +111,24 @@ class Solution {
120111
```cpp
121112
class Solution {
122113
public:
123-
const int inf = 0x3f3f3f3f;
124-
125114
int minSideJumps(vector<int>& obstacles) {
126-
vector<int> f = {1, 0, 1};
115+
const int inf = 1 << 30;
116+
int f[3] = {1, 0, 1};
127117
for (int i = 1; i < obstacles.size(); ++i) {
128-
int v = obstacles[i];
129-
vector<int> g(3, inf);
130-
for (int j = 0; j < 3; ++j) if (v != j + 1) g[j] = f[j];
131-
if (v != 1) g[0] = min(g[0], min(g[1], g[2]) + 1);
132-
if (v != 2) g[1] = min(g[1], min(g[0], g[2]) + 1);
133-
if (v != 3) g[2] = min(g[2], min(g[0], g[1]) + 1);
134-
f = move(g);
118+
for (int j = 0; j < 3; ++j) {
119+
if (obstacles[i] == j + 1) {
120+
f[j] = inf;
121+
break;
122+
}
123+
}
124+
int x = min({f[0], f[1], f[2]}) + 1;
125+
for (int j = 0; j < 3; ++j) {
126+
if (obstacles[i] != j + 1) {
127+
f[j] = min(f[j], x);
128+
}
129+
}
135130
}
136-
return *min_element(f.begin(), f.end());
131+
return min({f[0], f[1], f[2]});
137132
}
138133
};
139134
```
@@ -142,25 +137,21 @@ public:
142137
143138
```go
144139
func minSideJumps(obstacles []int) int {
145-
inf := 0x3f3f3f3f
146140
f := [3]int{1, 0, 1}
141+
const inf = 1 << 30
147142
for _, v := range obstacles[1:] {
148-
g := [3]int{inf, inf, inf}
149143
for j := 0; j < 3; j++ {
150-
if v != j+1 {
151-
g[j] = f[j]
144+
if v == j+1 {
145+
f[j] = inf
146+
break
152147
}
153148
}
154-
if v != 1 {
155-
g[0] = min(g[0], min(g[1], g[2])+1)
156-
}
157-
if v != 2 {
158-
g[1] = min(g[1], min(g[0], g[2])+1)
159-
}
160-
if v != 3 {
161-
g[2] = min(g[2], min(g[0], g[1])+1)
149+
x := min(f[0], min(f[1], f[2])) + 1
150+
for j := 0; j < 3; j++ {
151+
if v != j+1 {
152+
f[j] = min(f[j], x)
153+
}
162154
}
163-
f = g
164155
}
165156
return min(f[0], min(f[1], f[2]))
166157
}
@@ -173,6 +164,30 @@ func min(a, b int) int {
173164
}
174165
```
175166

167+
### **TypeScript**
168+
169+
```ts
170+
function minSideJumps(obstacles: number[]): number {
171+
const inf = 1 << 30;
172+
const f = [1, 0, 1];
173+
for (let i = 1; i < obstacles.length; ++i) {
174+
for (let j = 0; j < 3; ++j) {
175+
if (obstacles[i] == j + 1) {
176+
f[j] = inf;
177+
break;
178+
}
179+
}
180+
const x = Math.min(...f) + 1;
181+
for (let j = 0; j < 3; ++j) {
182+
if (obstacles[i] != j + 1) {
183+
f[j] = Math.min(f[j], x);
184+
}
185+
}
186+
}
187+
return Math.min(...f);
188+
}
189+
```
190+
176191
### **...**
177192

178193
```
Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,22 @@
11
class Solution {
22
public:
3-
const int inf = 0x3f3f3f3f;
4-
53
int minSideJumps(vector<int>& obstacles) {
6-
vector<int> f = {1, 0, 1};
4+
const int inf = 1 << 30;
5+
int f[3] = {1, 0, 1};
76
for (int i = 1; i < obstacles.size(); ++i) {
8-
int v = obstacles[i];
9-
vector<int> g(3, inf);
10-
for (int j = 0; j < 3; ++j) if (v != j + 1) g[j] = f[j];
11-
if (v != 1) g[0] = min(g[0], min(g[1], g[2]) + 1);
12-
if (v != 2) g[1] = min(g[1], min(g[0], g[2]) + 1);
13-
if (v != 3) g[2] = min(g[2], min(g[0], g[1]) + 1);
14-
f = move(g);
7+
for (int j = 0; j < 3; ++j) {
8+
if (obstacles[i] == j + 1) {
9+
f[j] = inf;
10+
break;
11+
}
12+
}
13+
int x = min({f[0], f[1], f[2]}) + 1;
14+
for (int j = 0; j < 3; ++j) {
15+
if (obstacles[i] != j + 1) {
16+
f[j] = min(f[j], x);
17+
}
18+
}
1519
}
16-
return *min_element(f.begin(), f.end());
20+
return min({f[0], f[1], f[2]});
1721
}
1822
};

0 commit comments

Comments
 (0)