【LeetCode(Java) - 582】杀死进程

1、题目描述

在这里插入图片描述

2、解题思路

  先把所有进程的子进程统计好存入一个 HashMap<Integer, List> 中,key 为进程编号,value 为子进程编号集合。

  当要杀死编号为 kill 的进程时,从 map 中找到 kill 的子进程,添加到待杀死 list 中,接着深度优先搜索 kill 子进程的子进程,一律装入到 list 中。

  返回 list。

3、解题代码

class Solution {
    
    
    /**
     * 当一个进程被杀掉的时候,它所有的孩子进程和后代进程都要被杀掉。可以以任意顺序排列返回的 PID 序列。
     * pid[i] 的父进程为 ppid[i]
     *
     * @param pid  进程编号,只有一个进程的 PPID 是 0 ,意味着这个进程没有父进程
     * @param ppid 父进程编号
     * @param kill 待杀死的进程编号
     * @return 被杀死的进程的编号集合
     */
    public List<Integer> killProcess(List<Integer> pid, List<Integer> ppid, int kill) {
    
    
        // key 为父进程编号,value 为该进程的子进程编号集合
        HashMap<Integer, List<Integer>> map = new HashMap<>();
        // 遍历父进程编号集合
        for (int i = 0; i < ppid.size(); i++) {
    
    
            if (ppid.get(i) > 0) {
    
    
                List<Integer> l = map.getOrDefault(ppid.get(i), new ArrayList<Integer>());  // 取出子进程集合
                l.add(pid.get(i));  // 添加新的子进程编号
                map.put(ppid.get(i), l);    // 把子进程集合放回去
            }
        }
        List<Integer> l = new ArrayList<>();
        l.add(kill);
        getAllChildren(map, l, kill);
        return l;
    }

    /**
     * 获取进程 kill 的所有子孙进程并装入到 l 中
     * @param map
     * @param l
     * @param kill
     */
    public void getAllChildren(HashMap<Integer, List<Integer>> map, List<Integer> l, int kill) {
    
    
        if (map.containsKey(kill)) {
    
        // 如果存在被杀死的进程
            for (int id : map.get(kill)) {
    
      // 取出待杀死进程的子进程编号集合
                l.add(id);  // 自己也要被杀死
                getAllChildren(map, l, id); // dfs,子进程的子进程也要杀死
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_29051413/article/details/108530711