题解 | #疯牛病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 背包问题 分治算法:归并排序、快速排序
