leetcode407. Trapping Rain Water II
Given an m x n matrix of positive integers representing the height of each unit cell in a 2D elevation map, compute the volume of water it is able to trap after raining.
Note:
Both m and n are less than 110. The height of each unit cell is greater than 0 and is less than 20,000.
Example:
Given the following 3x6 height map:
[
[1,4,3,1,3,2],
[3,2,1,3,2,4],
[2,3,3,2,3,1]
]
Return 4.
The above image represents the elevation map [[1,4,3,1,3,2],[3,2,1,3,2,4],[2,3,3,2,3,1]] before the rain.
After the rain, water is trapped between the blocks. The total volume of water trapped is 4.
신선 문제.우선 순위 와 넓이 를 우선 순위 로 결합 한 사람 은 모두 사내 라 는 것 을 생각 할 수 있다.이 문 제 를 본 모든 사람들 이 문장 답장 에서 이 문 제 를 쓰 는 방향 을 공유 할 수 있 기 를 바 랍 니 다.아래 에 오 일 파이프 의 사고방식 에 따라 쓴 JAVA 해답 을 붙 여 보 겠 습 니 다.
아이디어 와 코드
사고의 애니메이션
public int trapRainWater(int[][] heightMap) {
if (heightMap == null || heightMap.length <= 2 || heightMap[0].length <= 2) {
return 0;
}
int rowCount = heightMap.length;
int columnCount = heightMap[0].length;
boolean[][] visited = new boolean[rowCount][columnCount];
PriorityQueue queue = new PriorityQueue<>();
for (int i = 0 ; i < rowCount ; i++) {
visited[i][0] = true;
queue.offer(new Position(i, 0, heightMap[i][0]));
visited[i][columnCount-1] = true;
queue.offer(new Position(i, columnCount-1, heightMap[i][columnCount-1]));
}
for (int i = 1 ; i < columnCount ; i++) {
visited[0][i] = true;
queue.offer(new Position(0, i, heightMap[0][i]));
visited[rowCount-1][i] = true;
queue.offer(new Position(rowCount-1, i, heightMap[rowCount-1][i]));
}
int water = 0;
int max = 0;
while (!queue.isEmpty()) {
Position position = queue.poll();
if (position.value > max) {
max = position.value;
}else {
water += max - position.value;
}
int rowIndex = position.rowIndex;
int columnIndex = position.columnIndex;
if (rowIndex > 0 && !visited[rowIndex-1][columnIndex]) {
queue.offer(new Position(rowIndex-1, columnIndex, heightMap[rowIndex-1][columnIndex]));
visited[rowIndex-1][columnIndex] = true;
}
if (rowIndex < rowCount-1 && !visited[rowIndex+1][columnIndex]) {
queue.offer(new Position(rowIndex+1, columnIndex, heightMap[rowIndex+1][columnIndex]));
visited[rowIndex+1][columnIndex] = true;
}
if (columnIndex > 0 && !visited[rowIndex][columnIndex-1]) {
queue.offer(new Position(rowIndex, columnIndex-1, heightMap[rowIndex][columnIndex-1]));
visited[rowIndex][columnIndex-1] = true;
}
if (columnIndex < columnCount - 1 && !visited[rowIndex][columnIndex+1]) {
queue.offer(new Position(rowIndex, columnIndex+1, heightMap[rowIndex][columnIndex+1]));
visited[rowIndex][columnIndex+1] = true;
}
}
return water;
}
public static class Position implements Comparable {
int rowIndex;
int columnIndex;
int value;
Position(int rowIndex, int columnIndex, int value) {
this.rowIndex = rowIndex;
this.columnIndex = columnIndex;
this.value = value;
}
@Override
public int compareTo(Position o) {
return this.value - o.value;
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
나무깊이 우선 탐색(DFS) 깊이 우선 검색(DFS)은 트리 또는 그래프 데이터 구조를 탐색하거나 검색하기 위한 알고리즘입니다. 하나는 루트에서 시작하여(그래프의 경우 임의의 노드를 루트로 선택) 역추적하기 전에 각 분...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.