杀掉进程
难度:
标签:
题目描述
代码结果
运行时间: 59 ms, 内存: 20.4 MB
/*
题目思路:
1. 使用流构建进程树。
2. 使用递归方式杀掉进程及其子进程。
*/
import java.util.*;
import java.util.stream.Collectors;
public class KillProcessStream {
public List<Integer> killProcess(List<Integer> pid, List<Integer> ppid, int kill) {
Map<Integer, List<Integer>> processTree = ppid.stream().distinct().collect(Collectors.toMap(
p -> p,
p -> pid.stream().filter(id -> ppid.get(pid.indexOf(id)).equals(p)).collect(Collectors.toList())
));
List<Integer> result = new ArrayList<>();
killAllChildren(processTree, kill, result);
return result;
}
private void killAllChildren(Map<Integer, List<Integer>> processTree, int kill, List<Integer> result) {
result.add(kill);
if (processTree.containsKey(kill)) {
processTree.get(kill).forEach(child -> killAllChildren(processTree, child, result));
}
}
}
解释
方法:
这个题解采用了深度优先搜索(DFS)的方法来解决问题。首先,它建立了一个映射(maps),将每个父进程(ppid)映射到其子进程(pid)列表。然后,从要杀死的进程(kill)开始,使用递归函数process遍历整个进程树,将所有可达的子进程添加到结果列表(self.res)中。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
如何确保在构建父进程到子进程的映射时,不会遗漏任何进程或者重复添加进程?
▷🦆
在递归函数`process`中,是否有可能出现栈溢出的情况,如果有,如何预防?
▷🦆
如果`kill`指定的进程ID在pid列表中不存在怎么办?题解中似乎没有处理这种情况。
▷🦆
题解中的DFS方法是否考虑了进程ID可能不是连续的情况?
▷