|
| 1 | +import java.util.*; |
| 2 | + |
| 3 | +class Solution { |
| 4 | + |
| 5 | + static class Node { |
| 6 | + int r, c; |
| 7 | + |
| 8 | + Node(int r, int c) { |
| 9 | + this.r = r; |
| 10 | + this.c = c; |
| 11 | + } |
| 12 | + } |
| 13 | + |
| 14 | + private final int[] rows = {-1, 0, 1, 0}; |
| 15 | + private final int[] cols = {0, 1, 0, -1}; |
| 16 | + |
| 17 | + private int n, m; |
| 18 | + private int[][] map; |
| 19 | + private int[][] visited; |
| 20 | + private Map<Integer, Integer> areaSizes = new HashMap<>(); |
| 21 | + |
| 22 | + public int solution(int[][] land) { |
| 23 | + map = land; |
| 24 | + n = map.length; |
| 25 | + m = map[0].length; |
| 26 | + visited = new int[n][m]; |
| 27 | + |
| 28 | + int areaNumber = 1; |
| 29 | + for (int i = 0; i < n; i++) { |
| 30 | + for (int j = 0; j < m; j++) { |
| 31 | + if (visited[i][j] == 0 && map[i][j] > 0) { |
| 32 | + int size = bfs(areaNumber, new Node(i, j)); |
| 33 | + areaSizes.put(areaNumber++, size); |
| 34 | + } |
| 35 | + } |
| 36 | + } |
| 37 | + |
| 38 | + int maxSum = 0; |
| 39 | + for (int i = 0; i < m; i++) { |
| 40 | + boolean[] areaVisited = new boolean[areaNumber]; |
| 41 | + int currentSum = 0; |
| 42 | + for (int j = 0; j < n; j++) { |
| 43 | + if (map[j][i] == 1 && !areaVisited[visited[j][i]]) { |
| 44 | + areaVisited[visited[j][i]] = true; |
| 45 | + currentSum += areaSizes.get(visited[j][i]); |
| 46 | + } |
| 47 | + } |
| 48 | + maxSum = Math.max(currentSum, maxSum); |
| 49 | + } |
| 50 | + |
| 51 | + return maxSum; |
| 52 | + } |
| 53 | + |
| 54 | + public int bfs(int areaNumber, Node startNode) { |
| 55 | + Queue<Node> que = new LinkedList<>(); |
| 56 | + visited[startNode.r][startNode.c] = areaNumber; |
| 57 | + que.offer(startNode); |
| 58 | + |
| 59 | + int size = 1; |
| 60 | + while (!que.isEmpty()) { |
| 61 | + Node curNode = que.poll(); |
| 62 | + |
| 63 | + for (int i = 0; i < 4; i++) { |
| 64 | + int nextR = curNode.r + rows[i]; |
| 65 | + int nextC = curNode.c + cols[i]; |
| 66 | + |
| 67 | + if (nextR < 0 || nextR >= n || nextC < 0 || nextC >= m) { |
| 68 | + continue; |
| 69 | + } |
| 70 | + if (visited[nextR][nextC] == 0 && map[nextR][nextC] == 1) { |
| 71 | + size++; |
| 72 | + visited[nextR][nextC] = areaNumber; |
| 73 | + que.offer(new Node(nextR, nextC)); |
| 74 | + } |
| 75 | + } |
| 76 | + } |
| 77 | + return size; |
| 78 | + } |
| 79 | +} |
0 commit comments