前言
###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!!
习题
1.尽量减少恶意软件的传播
题面链接:924. 尽量减少恶意软件的传播 - 力扣(LeetCode)
题面:
分析:找到只有一个恶意软件的最大连通块,如果有多个,就取在initial中的较小值,贴上大佬代码如下:
代码:
class Solution {
private int nodeId, size;
public int minMalwareSpread(int[][] graph, int[] initial) {
int n = graph.length;
boolean[] vis = new boolean[n];
boolean[] isInitial = new boolean[n];
int mn = Integer.MAX_VALUE;
for (int x : initial) {
isInitial[x] = true;
mn = Math.min(mn, x);
}
int ans = -1;
int maxSize = 0;
for (int x : initial) {
if (vis[x]) {
continue;
}
nodeId = -1;
size = 0;
dfs(x, graph, vis, isInitial);
if (nodeId >= 0 && (size > maxSize || size == maxSize && nodeId < ans)) {
ans = nodeId;
maxSize = size;
}
}
return ans < 0 ? mn : ans;
}
private void dfs(int x, int[][] graph, boolean[] vis, boolean[] isInitial) {
vis[x] = true;
size++;
// 按照状态机更新 nodeId
if (nodeId != -2 && isInitial[x]) {
nodeId = nodeId == -1 ? x : -2;
}
for (int y = 0; y < graph[x].length; y++) {
if (graph[x][y] == 1 && !vis[y]) {
dfs(y, graph, vis, isInitial);
}
}
}
}
后言
上面是力扣图论专题,下一篇是其他的习题,希望有所帮助,一同进步,共勉!