Skip to content

Commit 7f9a026

Browse files
authored
feat: add solutions to lc problems: No.3341,3342 (#3707)
1 parent 96e5023 commit 7f9a026

File tree

14 files changed

+1036
-12
lines changed

14 files changed

+1036
-12
lines changed

solution/3300-3399/3341.Find Minimum Time to Reach Last Room I/README.md

+174-3
Original file line numberDiff line numberDiff line change
@@ -91,25 +91,196 @@ edit_url: https://github.com/doocs/leetcode/edit/main/solution/3300-3399/3341.Fi
9191
#### Python3
9292

9393
```python
94-
94+
class Solution:
95+
def minTimeToReach(self, moveTime: List[List[int]]) -> int:
96+
n, m = len(moveTime), len(moveTime[0])
97+
dist = [[inf] * m for _ in range(n)]
98+
dist[0][0] = 0
99+
pq = [(0, 0, 0)]
100+
dirs = (-1, 0, 1, 0, -1)
101+
while 1:
102+
d, i, j = heappop(pq)
103+
if i == n - 1 and j == m - 1:
104+
return d
105+
if d > dist[i][j]:
106+
continue
107+
for a, b in pairwise(dirs):
108+
x, y = i + a, j + b
109+
if 0 <= x < n and 0 <= y < m:
110+
t = max(moveTime[x][y], dist[i][j]) + 1
111+
if dist[x][y] > t:
112+
dist[x][y] = t
113+
heappush(pq, (t, x, y))
95114
```
96115

97116
#### Java
98117

99118
```java
100-
119+
class Solution {
120+
public int minTimeToReach(int[][] moveTime) {
121+
int n = moveTime.length;
122+
int m = moveTime[0].length;
123+
int[][] dist = new int[n][m];
124+
for (var row : dist) {
125+
Arrays.fill(row, Integer.MAX_VALUE);
126+
}
127+
dist[0][0] = 0;
128+
129+
PriorityQueue<int[]> pq = new PriorityQueue<>((a, b) -> a[0] - b[0]);
130+
pq.offer(new int[] {0, 0, 0});
131+
int[] dirs = {-1, 0, 1, 0, -1};
132+
while (true) {
133+
int[] p = pq.poll();
134+
int d = p[0], i = p[1], j = p[2];
135+
136+
if (i == n - 1 && j == m - 1) {
137+
return d;
138+
}
139+
if (d > dist[i][j]) {
140+
continue;
141+
}
142+
143+
for (int k = 0; k < 4; k++) {
144+
int x = i + dirs[k];
145+
int y = j + dirs[k + 1];
146+
if (x >= 0 && x < n && y >= 0 && y < m) {
147+
int t = Math.max(moveTime[x][y], dist[i][j]) + 1;
148+
if (dist[x][y] > t) {
149+
dist[x][y] = t;
150+
pq.offer(new int[] {t, x, y});
151+
}
152+
}
153+
}
154+
}
155+
}
156+
}
101157
```
102158

103159
#### C++
104160

105161
```cpp
106-
162+
class Solution {
163+
public:
164+
int minTimeToReach(vector<vector<int>>& moveTime) {
165+
int n = moveTime.size();
166+
int m = moveTime[0].size();
167+
vector<vector<int>> dist(n, vector<int>(m, INT_MAX));
168+
dist[0][0] = 0;
169+
priority_queue<array<int, 3>, vector<array<int, 3>>, greater<>> pq;
170+
pq.push({0, 0, 0});
171+
int dirs[5] = {-1, 0, 1, 0, -1};
172+
173+
while (1) {
174+
auto [d, i, j] = pq.top();
175+
pq.pop();
176+
177+
if (i == n - 1 && j == m - 1) {
178+
return d;
179+
}
180+
if (d > dist[i][j]) {
181+
continue;
182+
}
183+
184+
for (int k = 0; k < 4; ++k) {
185+
int x = i + dirs[k];
186+
int y = j + dirs[k + 1];
187+
188+
if (x >= 0 && x < n && y >= 0 && y < m) {
189+
int t = max(moveTime[x][y], dist[i][j]) + 1;
190+
if (dist[x][y] > t) {
191+
dist[x][y] = t;
192+
pq.push({t, x, y});
193+
}
194+
}
195+
}
196+
}
197+
}
198+
};
107199
```
108200

109201
#### Go
110202

111203
```go
204+
func minTimeToReach(moveTime [][]int) int {
205+
n, m := len(moveTime), len(moveTime[0])
206+
dist := make([][]int, n)
207+
for i := range dist {
208+
dist[i] = make([]int, m)
209+
for j := range dist[i] {
210+
dist[i][j] = math.MaxInt32
211+
}
212+
}
213+
dist[0][0] = 0
214+
215+
pq := &hp{}
216+
heap.Init(pq)
217+
heap.Push(pq, tuple{0, 0, 0})
218+
219+
dirs := []int{-1, 0, 1, 0, -1}
220+
for {
221+
p := heap.Pop(pq).(tuple)
222+
d, i, j := p.dis, p.x, p.y
223+
224+
if i == n-1 && j == m-1 {
225+
return d
226+
}
227+
if d > dist[i][j] {
228+
continue
229+
}
230+
231+
for k := 0; k < 4; k++ {
232+
x, y := i+dirs[k], j+dirs[k+1]
233+
if x >= 0 && x < n && y >= 0 && y < m {
234+
t := max(moveTime[x][y], dist[i][j]) + 1
235+
if dist[x][y] > t {
236+
dist[x][y] = t
237+
heap.Push(pq, tuple{t, x, y})
238+
}
239+
}
240+
}
241+
}
242+
}
243+
244+
type tuple struct{ dis, x, y int }
245+
type hp []tuple
246+
247+
func (h hp) Len() int { return len(h) }
248+
func (h hp) Less(i, j int) bool { return h[i].dis < h[j].dis }
249+
func (h hp) Swap(i, j int) { h[i], h[j] = h[j], h[i] }
250+
func (h *hp) Push(v any) { *h = append(*h, v.(tuple)) }
251+
func (h *hp) Pop() (v any) { a := *h; *h, v = a[:len(a)-1], a[len(a)-1]; return }
252+
```
112253

254+
#### TypeScript
255+
256+
```ts
257+
function minTimeToReach(moveTime: number[][]): number {
258+
const [n, m] = [moveTime.length, moveTime[0].length];
259+
const dist: number[][] = Array.from({ length: n }, () => Array(m).fill(Infinity));
260+
dist[0][0] = 0;
261+
const pq = new PriorityQueue({ compare: (a, b) => a[0] - b[0] });
262+
pq.enqueue([0, 0, 0]);
263+
const dirs = [-1, 0, 1, 0, -1];
264+
while (1) {
265+
const [d, i, j] = pq.dequeue();
266+
if (i === n - 1 && j === m - 1) {
267+
return d;
268+
}
269+
if (d > dist[i][j]) {
270+
continue;
271+
}
272+
for (let k = 0; k < 4; ++k) {
273+
const [x, y] = [i + dirs[k], j + dirs[k + 1]];
274+
if (x >= 0 && x < n && y >= 0 && y < m) {
275+
const t = Math.max(moveTime[x][y], dist[i][j]) + 1;
276+
if (dist[x][y] > t) {
277+
dist[x][y] = t;
278+
pq.enqueue([t, x, y]);
279+
}
280+
}
281+
}
282+
}
283+
}
113284
```
114285

115286
<!-- tabs:end -->

solution/3300-3399/3341.Find Minimum Time to Reach Last Room I/README_EN.md

+174-3
Original file line numberDiff line numberDiff line change
@@ -88,25 +88,196 @@ edit_url: https://github.com/doocs/leetcode/edit/main/solution/3300-3399/3341.Fi
8888
#### Python3
8989

9090
```python
91-
91+
class Solution:
92+
def minTimeToReach(self, moveTime: List[List[int]]) -> int:
93+
n, m = len(moveTime), len(moveTime[0])
94+
dist = [[inf] * m for _ in range(n)]
95+
dist[0][0] = 0
96+
pq = [(0, 0, 0)]
97+
dirs = (-1, 0, 1, 0, -1)
98+
while 1:
99+
d, i, j = heappop(pq)
100+
if i == n - 1 and j == m - 1:
101+
return d
102+
if d > dist[i][j]:
103+
continue
104+
for a, b in pairwise(dirs):
105+
x, y = i + a, j + b
106+
if 0 <= x < n and 0 <= y < m:
107+
t = max(moveTime[x][y], dist[i][j]) + 1
108+
if dist[x][y] > t:
109+
dist[x][y] = t
110+
heappush(pq, (t, x, y))
92111
```
93112

94113
#### Java
95114

96115
```java
97-
116+
class Solution {
117+
public int minTimeToReach(int[][] moveTime) {
118+
int n = moveTime.length;
119+
int m = moveTime[0].length;
120+
int[][] dist = new int[n][m];
121+
for (var row : dist) {
122+
Arrays.fill(row, Integer.MAX_VALUE);
123+
}
124+
dist[0][0] = 0;
125+
126+
PriorityQueue<int[]> pq = new PriorityQueue<>((a, b) -> a[0] - b[0]);
127+
pq.offer(new int[] {0, 0, 0});
128+
int[] dirs = {-1, 0, 1, 0, -1};
129+
while (true) {
130+
int[] p = pq.poll();
131+
int d = p[0], i = p[1], j = p[2];
132+
133+
if (i == n - 1 && j == m - 1) {
134+
return d;
135+
}
136+
if (d > dist[i][j]) {
137+
continue;
138+
}
139+
140+
for (int k = 0; k < 4; k++) {
141+
int x = i + dirs[k];
142+
int y = j + dirs[k + 1];
143+
if (x >= 0 && x < n && y >= 0 && y < m) {
144+
int t = Math.max(moveTime[x][y], dist[i][j]) + 1;
145+
if (dist[x][y] > t) {
146+
dist[x][y] = t;
147+
pq.offer(new int[] {t, x, y});
148+
}
149+
}
150+
}
151+
}
152+
}
153+
}
98154
```
99155

100156
#### C++
101157

102158
```cpp
103-
159+
class Solution {
160+
public:
161+
int minTimeToReach(vector<vector<int>>& moveTime) {
162+
int n = moveTime.size();
163+
int m = moveTime[0].size();
164+
vector<vector<int>> dist(n, vector<int>(m, INT_MAX));
165+
dist[0][0] = 0;
166+
priority_queue<array<int, 3>, vector<array<int, 3>>, greater<>> pq;
167+
pq.push({0, 0, 0});
168+
int dirs[5] = {-1, 0, 1, 0, -1};
169+
170+
while (1) {
171+
auto [d, i, j] = pq.top();
172+
pq.pop();
173+
174+
if (i == n - 1 && j == m - 1) {
175+
return d;
176+
}
177+
if (d > dist[i][j]) {
178+
continue;
179+
}
180+
181+
for (int k = 0; k < 4; ++k) {
182+
int x = i + dirs[k];
183+
int y = j + dirs[k + 1];
184+
185+
if (x >= 0 && x < n && y >= 0 && y < m) {
186+
int t = max(moveTime[x][y], dist[i][j]) + 1;
187+
if (dist[x][y] > t) {
188+
dist[x][y] = t;
189+
pq.push({t, x, y});
190+
}
191+
}
192+
}
193+
}
194+
}
195+
};
104196
```
105197

106198
#### Go
107199

108200
```go
201+
func minTimeToReach(moveTime [][]int) int {
202+
n, m := len(moveTime), len(moveTime[0])
203+
dist := make([][]int, n)
204+
for i := range dist {
205+
dist[i] = make([]int, m)
206+
for j := range dist[i] {
207+
dist[i][j] = math.MaxInt32
208+
}
209+
}
210+
dist[0][0] = 0
211+
212+
pq := &hp{}
213+
heap.Init(pq)
214+
heap.Push(pq, tuple{0, 0, 0})
215+
216+
dirs := []int{-1, 0, 1, 0, -1}
217+
for {
218+
p := heap.Pop(pq).(tuple)
219+
d, i, j := p.dis, p.x, p.y
220+
221+
if i == n-1 && j == m-1 {
222+
return d
223+
}
224+
if d > dist[i][j] {
225+
continue
226+
}
227+
228+
for k := 0; k < 4; k++ {
229+
x, y := i+dirs[k], j+dirs[k+1]
230+
if x >= 0 && x < n && y >= 0 && y < m {
231+
t := max(moveTime[x][y], dist[i][j]) + 1
232+
if dist[x][y] > t {
233+
dist[x][y] = t
234+
heap.Push(pq, tuple{t, x, y})
235+
}
236+
}
237+
}
238+
}
239+
}
240+
241+
type tuple struct{ dis, x, y int }
242+
type hp []tuple
243+
244+
func (h hp) Len() int { return len(h) }
245+
func (h hp) Less(i, j int) bool { return h[i].dis < h[j].dis }
246+
func (h hp) Swap(i, j int) { h[i], h[j] = h[j], h[i] }
247+
func (h *hp) Push(v any) { *h = append(*h, v.(tuple)) }
248+
func (h *hp) Pop() (v any) { a := *h; *h, v = a[:len(a)-1], a[len(a)-1]; return }
249+
```
109250

251+
#### TypeScript
252+
253+
```ts
254+
function minTimeToReach(moveTime: number[][]): number {
255+
const [n, m] = [moveTime.length, moveTime[0].length];
256+
const dist: number[][] = Array.from({ length: n }, () => Array(m).fill(Infinity));
257+
dist[0][0] = 0;
258+
const pq = new PriorityQueue({ compare: (a, b) => a[0] - b[0] });
259+
pq.enqueue([0, 0, 0]);
260+
const dirs = [-1, 0, 1, 0, -1];
261+
while (1) {
262+
const [d, i, j] = pq.dequeue();
263+
if (i === n - 1 && j === m - 1) {
264+
return d;
265+
}
266+
if (d > dist[i][j]) {
267+
continue;
268+
}
269+
for (let k = 0; k < 4; ++k) {
270+
const [x, y] = [i + dirs[k], j + dirs[k + 1]];
271+
if (x >= 0 && x < n && y >= 0 && y < m) {
272+
const t = Math.max(moveTime[x][y], dist[i][j]) + 1;
273+
if (dist[x][y] > t) {
274+
dist[x][y] = t;
275+
pq.enqueue([t, x, y]);
276+
}
277+
}
278+
}
279+
}
280+
}
110281
```
111282

112283
<!-- tabs:end -->

0 commit comments

Comments
 (0)