题解 | #疯牛病I# Java
疯牛病I
https://www.nowcoder.com/practice/2066902a557647ce8e85c9d2d5874086
- 首先,初始化一些变量。m 和 n 分别表示牧场的行数和列数。count 表示健康牛的数量,初始值为 0。list 是一个链表,用来存储患有疯牛病的牛的位置。
- 然后,遍历牧场中的每个单元格。如果当前单元格的值为 2,则将其位置添加到 list 中;如果当前单元格的值为 1,则将 count 的值加 1。
- 接下来,定义一个二维数组 directions,表示患有疯牛病的牛周围 4 个方向上相邻单元格的坐标偏移量。
- 然后,使用 while 循环来模拟过去 k 分钟内患有疯牛病的牛感染周围健康牛的过程。在每次循环中,首先获取当前 list 的大小,并遍历其中每个元素。对于每个元素,分别计算其周围 4 个方向上相邻单元格的坐标,并判断该坐标是否在牧场范围内。如果在范围内且该单元格中有健康牛,则将该单元格中的牛感染,并将其位置添加到 list 中。
- 最后,返回剩余健康牛的数量。
public class Solution { public int healthyCows (int[][] pasture, int k) { int m = pasture.length; int n = pasture[0].length; int count = 0; LinkedList<int[]> list = new LinkedList<>(); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (pasture[i][j] == 2) list.add(new int[] {i, j}); else if (pasture[i][j] == 1) count++; } } int[][] directions = new int[][] {{0, -1}, {0, 1}, {1, 0}, {-1, 0}}; while (!list.isEmpty() && k > 0) { int size = list.size(); for (int i = 0; i < size; i++) { int []temp = list.removeFirst(); for (int j = 0; j < 4; ++j) { int newx = temp[0] + directions[j][0]; int newy = temp[1] + directions[j][1]; if (newx >= 0 && newx < m && newy >= 0 && newy < n) { if (pasture[newx][newy] == 1) { pasture[newx][newy] = 2; count--; list.add(new int[] {newx, newy}); } } } } k--; } return count; } }
算法题刷刷刷 文章被收录于专栏
数组、链表、栈、队列、堆、树、图等。 查找和排序:二分查找、线性查找、快速排序、归并排序、堆排序等。 动态规划:背包问题、最长公共子序列、最短路径 贪心算法:活动选择、霍夫曼编码 图:深度优先搜索、广度优先搜索、拓扑排序、最短路径算法(如 Dijkstra、Floyd-Warshall) 字符串操作:KMP 算法、正则表达式匹配 回溯算法:八皇后问题、0-1 背包问题 分治算法:归并排序、快速排序