中级农民
- 积分
- 103
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2018-7-25
- 最后登录
- 1970-1-1
|
第一题岛屿面积的 one pass 解法:
- public int maxArea(int[][] matrix) {
- int[][] visited = new int[matrix.length][matrix[0].length];
- int max = 0;
- for (int i = 0; i < matrix.length; i ++) {
- for (int j = 0; j < matrix.length; j ++) {
- if (visited[i][j] == 0 && matrix[i][j] == 1) {
- max = Math.max(max, countIsland(matrix, visited, i, j));
- }
- }
- }
- return max;
- }
- private int countIsland(int[][] matrix, int[][] visited, int i, int j) {
- if (i < 0 || i >= matrix.length || j < 0 || j >= matrix[0].length || visited[i][j] != 0) return 0;
- if (matrix[i][j] == 1) {
- visited[i][j] = 1;
- int res = 0;
- for (int[] dir : new int[][]{{1, 0}, {-1, 0}, {0, 1}, {0, -1}}) {
- res += countIsland(matrix, visited, i + dir[0], j + dir[1]);
- }
- return res;
- }
- else {
- int[] res = new int[1];
- if (countLake(matrix, visited, i, j, res)) {
- return res[0];
- }
- else {
- return 0;
- }
- }
- }
- private boolean countLake(int[][] matrix, int[][] visited, int i, int j, int[] res) {
- if (i == 0 || i == matrix.length - 1 || j == 0 || j == matrix[0].length - 1 || visited[i][j] == -1 && matrix[i][j] == 0) return false;
- if (visited[i][j] == 1 || matrix[i][j] == 1) return true;
- res[0] += 1;
- for (int[] dir : new int[][]{{1, 0}, {-1, 0}, {0, 1}, {0, -1}}) {
- boolean isLake = countLake(matrix, visited, i + dir[0], j + dir[1], res);
- if (!isLake) {
- visited[i][j] = -1;
- return false;
- }
- }
- visited[i][j] = 1;
- return true;
- }
复制代码 |
|