本文主要是介绍力扣 面试题 16.19. 水域大小,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目
你有一个用于表示一片土地的整数矩阵land,该矩阵中每个点的值代表对应地点的海拔高度。若值为0则表示水域。由垂直、水平或对角连接的水域为池塘。池塘的大小是指相连接的水域的个数。编写一个方法来计算矩阵中所有池塘的大小,返回值需要从小到大排序。
示例
输入:
[
[0,2,1,0],
[0,1,0,1],
[1,1,0,1],
[0,1,0,1]
]
输出: [1,2,4]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/pond-sizes-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
方法1:BFS
Java实现
class Solution {int row, col;//8个方向:上、下、左、右、左上、左下、右上、右下int[][] directions = new int[][]{{-1, 0}, {1, 0}, {0, -1}, {0, 1}, {-1, -1}, {1, -1}, {-1, 1}, {1, 1}};List<Integer> res = new ArrayList<>();public int[] pondSizes(int[][] land) {row = land.length;col = land[0].length;for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {if (land[i][j] == 0) {res.add(track_back(land, i, j));}}}int[] out = new int[res.size()];for (int i = 0; i < res.size(); i++) out[i] = res.get(i);Arrays.sort(out);return out;}public int track_back(int[][] land, int ii, int jj) {int sum = 0;Queue<int[]> q = new LinkedList<>();q.offer(new int[]{ii, jj});while (!q.isEmpty()) {int sz = q.size();for (int i = 0; i < sz; i++) {int[] cur = q.poll();sum++;land[cur[0]][cur[1]] = 1;for (int j = 0; j < directions.length; j++) {int x = cur[0] + directions[j][0];int y = cur[1] + directions[j][1];if (x >= row || x < 0 || y >= col || y < 0 || land[x][y] != 0) continue;q.offer(new int[]{x, y});land[x][y] = 1;}}}return sum;}
}
这篇关于力扣 面试题 16.19. 水域大小的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!