| 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 [][]int
 
- func (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
 
- }
 
 
  |