知识点
数组,广度优先遍历
解题思路
将全部为2的节点放到队列中。
当队列不为空并且k大于0时,我们将队列中的节点取出,将其上下左右为1的节点都置为2,再将其放入队列中。
其中我们可以用set来保存已经处理过的节点,减少判断
Java题解
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pasture int整型二维数组
* @param k int整型
* @return int整型
*/
public int healthyCows (int[][] pasture, int k) {
// write code here
int n = pasture.length, m = pasture[0].length;
// 存放判断过的结点
Set<Integer> set = new HashSet<>();
Deque<int[]> deque = new LinkedList<>();
int ans = m * n;
// 把为2的添加进队列
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if(pasture[i][j] == 2){
deque.offerFirst(new int[]{i,j});
set.add(i*m+j);
ans--;
} else if(pasture[i][j] == 0) {
ans--;
}
}
}
// 四个方向
int[][] point = new int[][]{{0,1},{0,-1},{1,0},{-1,0}};
while(!deque.isEmpty() && k > 0){
int size = deque.size();
//遍历当前队列
for(int i = 0; i < size; i++){
int[] ints = deque.pollFirst();
for(int j = 0; j < 4; j++){
int newY = ints[0] + point[j][0];
int newX = ints[1] + point[j][1];
if(set.contains(newY * m + newX) || newY < 0 || newY >= n || newX < 0 || newX >= m){
continue;
}
if(pasture[newY][newX] == 1){
deque.offerLast(new int[]{newY,newX});
set.add(newY * m + newX);
ans--;
}
}
}
k--;
}
return ans;
}
}



京公网安备 11010502036488号