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