417 pacific atlantic water flow
https://leetcode.com/problems/pacific-atlantic-water-flow/
class Solution {
int[][] DIR = new int[][]{{-1, 0}, {1, 0}, {0, 1}, {0, -1}};
// int[][] ADIR = new int[][]{{0, -1}, {-1, 0}};
private class Node {
int i;
int j;
public Node(int i, int j) {
this.i = i;
this.j = j;
}
public String toString() {
return this.i + " " + this.j;
}
}
public List<List<Integer>> pacificAtlantic(int[][] heights) {
int m = heights.length;
int n = heights[0].length;
int[][] pflood = new int[m][n];
Queue<Node> queue = new ArrayDeque<>();
Set<String> visited = new HashSet<>();
for (int i = 0; i < m; i++) {
queue.offer(new Node(i, 0));
}
for (int j = 0; j < n; j++) {
queue.offer(new Node(0, j));
}
while (!queue.isEmpty()) {
Node node = queue.poll();
if (visited.contains(node.toString())) continue;
visited.add(node.toString());
pflood[node.i][node.j] = 1;
for (int[] dir : DIR) {
int x = dir[0] + node.i;
int y = dir[1] + node.j;
if (x >= 0 && x < m && y >= 0 && y < n) {
if (heights[node.i][node.j] <= heights[x][y]) {
queue.offer(new Node(x, y));
}
}
}
}
visited.clear();
for (int i = 0; i < m; i++) {
queue.offer(new Node(i, n - 1));
}
for (int j = 0; j < n; j++) {
queue.offer(new Node(m - 1, j));
}
List<List<Integer>> ans = new ArrayList<>();
while (!queue.isEmpty()) {
Node node = queue.poll();
if (visited.contains(node.toString())) continue;
visited.add(node.toString());
if (pflood[node.i][node.j] == 1) {
ans.add(Arrays.asList(node.i, node.j));
}
for (int[] dir : DIR) {
int x = dir[0] + node.i;
int y = dir[1] + node.j;
if (x >= 0 && x < m && y >= 0 && y < n) {
if (heights[node.i][node.j] <= heights[x][y]) {
queue.offer(new Node(x, y));
}
}
}
}
return ans;
}
}
从海洋反向淹大陆
四个方向都要尝试
queue一开始可以边界上的node都放进去
这道题和542一样都是一开始加一堆node进去的类型
Last updated