本题采用广度优先搜索的方法
先回顾一下广度优先搜索 下面的是二叉树的广度优先搜索 而题目类似于图论的广度优先搜索
// 102.二叉树的层序遍历
class Solution {
public List<List<Integer>> resList = new ArrayList<List<Integer>>();
public List<List<Integer>> levelOrder(TreeNode root) {
//checkFun01(root,0);
checkFun02(root);
return resList;
}
//DFS--递归方式
public void checkFun01(TreeNode node, Integer deep) {
if (node == null) return;
deep++;
if (resList.size() < deep) {
//当层级增加时,list的Item也增加,利用list的索引值进行层级界定
List<Integer> item = new ArrayList<Integer>();
resList.add(item);
}
resList.get(deep - 1).add(node.val);
checkFun01(node.left, deep);
checkFun01(node.right, deep);
}
//BFS--迭代方式--借助队列
public void checkFun02(TreeNode node) {
if (node == null) return;
Queue<TreeNode> que = new LinkedList<TreeNode>();
que.offer(node);
while (!que.isEmpty()) {
List<Integer> itemList = new ArrayList<Integer>();
int len = que.size();
while (len > 0) {
TreeNode tmpNode = que.poll();
itemList.add(tmpNode.val);
if (tmpNode.left != null) que.offer(tmpNode.left);
if (tmpNode.right != null) que.offer(tmpNode.right);
len--;
}
resList.add(itemList);
}
}
}
class Solution {
public int minMalwareSpread(int[][] graph, int[] initial) {
int n = graph.length;
int[] ids = new int[n];
Map<Integer, Integer> idToSize = new HashMap<Integer, Integer>();
int id = 0;
for (int i = 0; i < n; ++i) {
if (ids[i] == 0) {
id++;
int size = 1;
Queue<Integer> queue = new LinkedList<Integer>();
queue.offer(i);
ids[i] = id;
while (!queue.isEmpty()) {
int u = queue.poll();
for (int v = 0; v < n; ++v) {
if (ids[v] == 0 && graph[u][v] == 1) {
size++;
queue.offer(v);
ids[v] = id;
}
}
}
idToSize.put(id, size);
}
}
Map<Integer, Integer> idToInitials = new HashMap<Integer, Integer>();
for (int u : initial) {
idToInitials.put(ids[u], idToInitials.getOrDefault(ids[u], 0) + 1);
}
int ans = n + 1, ansRemoved = 0;
for (int u : initial) {
int removed = (idToInitials.get(ids[u]) == 1 ? idToSize.get(ids[u]) : 0);
if (removed > ansRemoved || (removed == ansRemoved && u < ans)) {
ans = u;
ansRemoved = removed;
}
}
return ans;
}
}