?LeetCode刷題實(shí)戰(zhàn)582:殺掉進(jìn)程
示例

解題
主要思路:
class?Solution?{
????/**
?????* 當(dāng)一個(gè)進(jìn)程被殺掉的時(shí)候,它所有的孩子進(jìn)程和后代進(jìn)程都要被殺掉。可以以任意順序排列返回的 PID 序列。
?????* pid[i] 的父進(jìn)程為 ppid[i]
?????*
?????* @param?pid 進(jìn)程編號(hào),只有一個(gè)進(jìn)程的 PPID 是 0 ,意味著這個(gè)進(jìn)程沒(méi)有父進(jìn)程
?????* @param?ppid 父進(jìn)程編號(hào)
?????* @param?kill 待殺死的進(jìn)程編號(hào)
?????* @return?被殺死的進(jìn)程的編號(hào)集合
?????*/
????public?ListkillProcess(List pid, List ppid, int kill) {
????????// key 為父進(jìn)程編號(hào),value 為該進(jìn)程的子進(jìn)程編號(hào)集合
????????HashMapList > map = new?HashMap<>();
????????// 遍歷父進(jìn)程編號(hào)集合
????????for?(int i = 0; i < ppid.size(); i++) {
????????????if?(ppid.get(i) > 0) {
????????????????Listl = map.getOrDefault(ppid.get(i), new?ArrayList ()); // 取出子進(jìn)程集合
????????????????l.add(pid.get(i)); // 添加新的子進(jìn)程編號(hào)
????????????????map.put(ppid.get(i), l); // 把子進(jìn)程集合放回去
????????????}
????????}
????????Listl = new?ArrayList<>();
????????l.add(kill);
????????getAllChildren(map, l, kill);
????????return?l;
????}
????/**
?????* 獲取進(jìn)程 kill 的所有子孫進(jìn)程并裝入到 l 中
?????* @param?map
?????* @param?l
?????* @param?kill
?????*/
????public?void getAllChildren(HashMapList > map, List l, int kill) {
????????if?(map.containsKey(kill)) { // 如果存在被殺死的進(jìn)程
????????????for?(int id : map.get(kill)) { // 取出待殺死進(jìn)程的子進(jìn)程編號(hào)集合
????????????????l.add(id); // 自己也要被殺死
????????????????getAllChildren(map, l, id); // dfs,子進(jìn)程的子進(jìn)程也要?dú)⑺?/span>
????????????}
????????}
????}
}
