​LeetCode刷题实战582:杀掉进程

程序IT圈

共 2824字,需浏览 6分钟

 ·

2022-04-17 23:18

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !

今天和大家聊的问题叫做 杀掉进程,我们先来看题面:
https://leetcode-cn.com/problems/kill-process/


Given n processes, each process has a unique PID (process id) and its PPID (parent process id).
Each process only has one parent process, but may have one or more children processes. This is just like a tree structure. Only one process has PPID that is 0, which means this process has no parent process. All the PIDs will be distinct positive integers.
We use two list of integers to represent a list of processes, where the first list contains PID for each process and the second list contains the corresponding PPID.
Now given the two lists, and a PID representing a process you want to kill, return a list of PIDs of processes that will be killed in the end. You should assume that when a process is killed, all its children processes will be killed. No order is required for the final answer.


给 n 个进程,每个进程都有一个独一无二的 PID (进程编号)和它的 PPID (父进程编号)。

每一个进程只有一个父进程,但是每个进程可能会有一个或者多个孩子进程。它们形成的关系就像一个树状结构。只有一个进程的 PPID 是 0 ,意味着这个进程没有父进程。所有的 PID 都会是唯一的正整数。

我们用两个序列来表示这些进程,第一个序列包含所有进程的 PID ,第二个序列包含所有进程对应的 PPID。

现在给定这两个序列和一个 PID 表示你要杀死的进程,函数返回一个 PID 序列,表示因为杀这个进程而导致的所有被杀掉的进程的编号。

当一个进程被杀掉的时候,它所有的孩子进程和后代进程都要被杀掉。

你可以以任意顺序排列返回的 PID 序列。

示例


解题


https://blog.csdn.net/qq_29051413/article/details/108530711


主要思路:

 先把所有进程的子进程统计好存入一个 HashMap 中,key 为进程编号
value 为子进程编号集合。
当要杀死编号为 kill 的进程时,从 map 中找到 kill 的子进程,添加到待杀死 list 中,接着深度优先搜索 kill 子进程的子进程,一律装入到 list 中。
返回 list。

class Solution {
    /**
     * 当一个进程被杀掉的时候,它所有的孩子进程和后代进程都要被杀掉。可以以任意顺序排列返回的 PID 序列。
     * pid[i] 的父进程为 ppid[i]
     *
     * @param pid 进程编号,只有一个进程的 PPID 是 0 ,意味着这个进程没有父进程
     * @param ppid 父进程编号
     * @param kill 待杀死的进程编号
     * @return 被杀死的进程的编号集合
     */

    public List killProcess(List pid, List ppid, int kill) {
        // key 为父进程编号,value 为该进程的子进程编号集合
        HashMapList> map = new HashMap<>();
        // 遍历父进程编号集合
        for (int i = 0; i < ppid.size(); i++) {
            if (ppid.get(i) > 0) {
                List l = map.getOrDefault(ppid.get(i), new ArrayList()); // 取出子进程集合
                l.add(pid.get(i)); // 添加新的子进程编号
                map.put(ppid.get(i), l); // 把子进程集合放回去
            }
        }
        List l = new ArrayList<>();
        l.add(kill);
        getAllChildren(map, l, kill);
        return l;
    }

    /**
     * 获取进程 kill 的所有子孙进程并装入到 l 中
     * @param map
     * @param l
     * @param kill
     */

    public void getAllChildren(HashMapList> map, List l, int kill) {
        if (map.containsKey(kill)) { // 如果存在被杀死的进程
            for (int id : map.get(kill)) { // 取出待杀死进程的子进程编号集合
                l.add(id); // 自己也要被杀死
                getAllChildren(map, l, id); // dfs,子进程的子进程也要杀死
            }
        }
    }
}


好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力 。

上期推文:
LeetCode1-580题汇总,希望对你有点帮助!
LeetCode刷题实战581:最短无序连续子数组

浏览 9
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报