思路
深度优先搜索
LeetCode没有全部AC,卡在了第53个测试用例,原因是超时。
public static List<Integer> findMinHeightTrees(int n, int[][] edges) {
int[][] tree = graph(n, edges);
Map<Integer, List<Integer>> deepList = new HashMap<Integer, List<Integer>>();
int minDeep = Integer.MAX_VALUE;
for (int i = 0; i < n; i++)
{
int deep = 0;
int[] deeps = new int[1];
boolean[] visited = new boolean[n];
dfs2(n, tree, i, deep, deeps, visited);
int max = deeps[0];
if (max <= minDeep)
{
List<Integer> l = deepList.getOrDefault(max, new ArrayList<Integer>());
l.add(i);
deepList.put(max, l);
minDeep = max;
}
}
return deepList.get(minDeep);
}
public static void dfs2(int n, int[][] edges, int i, int deep, int[] maxDeep, boolean[] visited)
{
visited[i] = true;
for (int j = 0; j < n; j++)
{
if (edges[i][j] == 1 && !visited[j])
{
dfs2(n, edges, j, deep+1, maxDeep, visited);
maxDeep[0] = maxDeep[0] > deep+1 ? maxDeep[0] : deep+1;
}
}
}
public static int[][] graph(int n, int[][] edges)
{
int[][] tree = new int[n][n];
for (int i = 0; i < edges.length; i++)
{
tree[edges[i][0]][edges[i][1]] = 1;
tree[edges[i][1]][edges[i][0]] = 1;
}
return tree;
}
/*
public static int getMax(List<Integer> list) {
int max = 0;
for (int i : list)
max = max > i ? max : i;
return max;
}
public static void dfs(int n, int[][] edges, int i, int deep, List<Integer> deeps, boolean[] visited)
{
visited[i] = true;
for (int j = 0; j < n; j++)
{
if (edges[i][j] == 1 && !visited[j])
{
dfs(n, edges, j, deep+1, deeps, visited);
deeps.add(deep+1);
}
}
}
*/