题解 | #疯牛病II# Java

疯牛病II

https://www.nowcoder.com/practice/2d5c96e452a949e09d98bb32aec3b61d

  1. 首先,初始化一些变量。m 和 n 分别表示牧场的行数和列数。count 表示健康牛的数量,初始值为 0。list 是一个链表,用来存储患有疯牛病的牛的位置。
  2. 然后,遍历牧场中的每个单元格。如果当前单元格的值为 2,则将其位置添加到 list 中;如果当前单元格的值为 1,则将 count 的值加 1。
  3. 接下来,定义一个整数变量 k 来记录经过的分钟数,并初始化为 0。定义一个二维数组 directions,表示患有疯牛病的牛周围 4 个方向上相邻单元格的坐标偏移量。
  4. 然后,使用 while 循环来模拟患有疯牛病的牛感染周围健康牛的过程。在每次循环中,首先将 k 的值加 1,并获取当前 list 的大小。然后遍历其中每个元素,对于每个元素,分别计算其周围 4 个方向上相邻单元格的坐标,并判断该坐标是否在牧场范围内。如果在范围内且该单元格中有健康牛,则将该单元格中的牛感染,并将其位置添加到 list 中。
  5. 最后,判断剩余健康牛的数量是否大于 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 背包问题 分治算法:归并排序、快速排序

全部评论

相关推荐

屌丝逆袭咸鱼计划:心态摆好,man,晚点找早点找到最后都是为了提升自己好进正职,努力提升自己才是最关键的😤难道说现在找不到找的太晚了就炸了可以鸡鸡了吗😤早实习晚实习不都是为了以后多积累,大四学长有的秋招进的也不妨碍有的春招进,人生就这样
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务