1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
import "container/heap"
type Item struct{ val, x, y int }
type PQ []Item
func (h PQ) Len() int { return len(h) }
func (h PQ) Less(i, j int) bool { return h[i].val > h[j].val }
func (h PQ) Swap(i, j int) { h[i], h[j] = h[j], h[i] }
func (h *PQ) Push(x any) { *h = append(*h, x.(Item)) }
func (h *PQ) Pop() any { old := *h; x := old[len(old)-1]; *h = old[:len(old)-1]; return x }
func maximumMinimumPath(grid [][]int) int {
m, n := len(grid), len(grid[0])
vis := make([][]bool, m)
for i := range vis { vis[i] = make([]bool, n) }
pq := &PQ{{grid[0][0], 0, 0}}
heap.Init(pq)
dirs := [][2]int{{0,1},{1,0},{0,-1},{-1,0}}
for pq.Len() > 0 {
item := heap.Pop(pq).(Item)
val, x, y := item.val, item.x, item.y
if x == m-1 && y == n-1 { return val }
if vis[x][y] { continue }
vis[x][y] = true
for _, d := range dirs {
nx, ny := x+d[0], y+d[1]
if nx >= 0 && nx < m && ny >= 0 && ny < n && !vis[nx][ny] {
heap.Push(pq, Item{min(val, grid[nx][ny]), nx, ny})
}
}
}
return -1
}
func min(a, b int) int { if a < b { return a } else { return b } }
|