| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 | func trapRainWater(heightMap [][]int) (water int) {	m := len(heightMap)	if m == 0 {		return	}	n := len(heightMap[0])	if n == 0 {		return	}	visited := make([][]bool, m)	for i := 0; i < m; i++ {		visited[i] = make([]bool, n)	}	var pq PriorityQueue	for i := 0; i < m; i++ {		heap.Push(&pq, []int{heightMap[i][0], 0, i})		heap.Push(&pq, []int{heightMap[i][n-1], n - 1, i})	}	for i := 1; i < n-1; i++ {		heap.Push(&pq, []int{heightMap[0][i], i, 0})		heap.Push(&pq, []int{heightMap[m-1][i], i, m - 1})	}	max := 0	for pq.Len() != 0 {		cell := heap.Pop(&pq).([]int)		if max < cell[0] {			max = cell[0]		}		for i := 0; i < 4; i++ {			nx, ny := cell[1]+dx[i], cell[2]+dy[i]			if 0 < nx && nx < n-1 && 0 < ny && ny < m-1 && !visited[ny][nx] {				h := heightMap[ny][nx]				if h < max {					water += max - h				}				heap.Push(&pq, []int{h, nx, ny})				visited[ny][nx] = true			}		}	}	return}var dx []int = []int{1, 0, -1, 0}var dy []int = []int{0, 1, 0, -1}type PriorityQueue [][]intfunc (pq PriorityQueue) Len() int           { return len(pq) }func (pq PriorityQueue) Less(i, j int) bool { return pq[i][0] < pq[j][0] }func (pq PriorityQueue) Swap(i, j int)      { pq[i], pq[j] = pq[j], pq[i] }func (pq *PriorityQueue) Push(x interface{}) {	*pq = append(*pq, x.([]int))}func (pq *PriorityQueue) Pop() interface{} {	x := (*pq)[pq.Len()-1]	*pq = (*pq)[:pq.Len()-1]	return x}
 |