#头条创作挑战赛#给你一个数组nums,2: 阳性1: 阴性0: 阻断的环境t->t 1(每个标准单位时间): 2会将其上下左右四个方向的1变为2问题:求全局所有1都变为2的最短时间实现: int findMinTime(int [][]nums)例子:1、输入nums={{1,0,1,2},{1,0,1,1},{1,1,1,1},{1,0,1,2},}输出: 62、nums={{1,0,1,2},{1,0,1,1},{1,0,1,1},{1,0,1,2},}输出: -1,下面我们就来聊聊关于各种传染病的传播系数?接下来我们就一起去了解一下吧!

各种传染病的传播系数(传染病的传播求解)

各种传染病的传播系数

#创作挑战赛#

题目:

给你一个数组nums,2: 阳性1: 阴性0: 阻断的环境t->t 1(每个标准单位时间): 2会将其上下左右四个方向的1变为2问题:求全局所有1都变为2的最短时间实现: int findMinTime(int [][]nums)例子:1、输入nums={{1,0,1,2},{1,0,1,1},{1,1,1,1},{1,0,1,2},}输出: 62、nums={{1,0,1,2},{1,0,1,1},{1,0,1,1},{1,0,1,2},}输出: -1

思路:

广度优先遍历,利用队列。初始时先把数组中所有的2放入队列中。遍历队列, 每遍历一遍队列并且遇到了1,就把1传播成2,把新传播的数对放入队列中。 次数 1.如果最后仍然存在1,则返回-1, 否则返回传播次数。

java代码:

public int findMinTime(int[][] nums) { int minTime = 0; int len = nums.length; Queue<int[]> queue = new LinkedList<int[]>(); for (int i = 0; i < len; i ) { for (int j = 0; j < len; j ) { if (nums[i][j] == 2) { queue.offer(new int[] {i, j}); } } } while (!queue.isEmpty()) { int size = queue.size(); boolean added = false; int[][] dict = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; for (int k = 0; k < size; k ) { int[] map2 = queue.poll(); for (int[] dic : dict) { int m = map2[0] dic[0]; int n = map2[1] dic[1]; if (m < 0 || n < 0 || m >= len || n >= len || nums[m][n] != 1) { continue; } nums[m][n] = 2; queue.offer(new int[] {m, n}); if (!added) { added = true; minTime ; } } } } for (int i = 0; i < len; i ) { for (int j = 0; j < len; j ) { if (nums[i][j] == 1) { return -1; } } } return minTime; }

,