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.

答案
recursive - TLE

class Solution {
    public List<Integer> killProcess(List<Integer> pid, List<Integer> ppid, int kill) {
        List<Integer> shouldKill = recur(pid, ppid, kill);
        shouldKill.add(kill);
        return shouldKill;
    }

    public List<Integer> recur(List<Integer> pid, List<Integer> ppid, int kill) {
        List<Integer> shouldKill = new ArrayList<>();
        // find all children of kill
        for(int i = 0; i < ppid.size(); i++) {
            if(ppid.get(i) == kill)
                shouldKill.add(pid.get(i));
        }

        // for each child, call killProcess recursively
        List<Integer> ret = new ArrayList<>();
        for(int sk : shouldKill) {
            ret.addAll(recur(pid, ppid, sk));
        }
        shouldKill.addAll(ret);
        return shouldKill;
    }
}

Use Queue
这个也TLE了,那么猜想可能是因为对每一个queue里的元素,都要做一个for 循环寻找它的children这个部分比较耗时吧

class Solution {
    public List<Integer> killProcess(List<Integer> pid, List<Integer> ppid, int kill) {
        Queue<Integer> q = new LinkedList<>();
        List<Integer> shouldKill = new ArrayList<>();
        
        q.offer(kill);
        shouldKill.add(kill);
        while(!q.isEmpty()) {
            int t = q.poll();
            for(int i = 0; i < ppid.size(); i++) {
                if(ppid.get(i) == t) {
                    int process = pid.get(i);
                    q.add(process);
                    shouldKill.add(process);
                }
            }
        }
        return shouldKill;
    }
}

最终改进版

class Solution {
    public List<Integer> killProcess(List<Integer> pid, List<Integer> ppid, int kill) {
        Queue<Integer> q = new LinkedList<>();
        List<Integer> shouldKill = new ArrayList<>();
        Map<Integer, List<Integer>> childrenMap = new HashMap<Integer, List<Integer>>();
        
        int i = 0;
        for(int p : ppid) {
            List<Integer> children = childrenMap.get(p);
            if(children == null) {
                children = new ArrayList<>();
                childrenMap.put(p, children);
            }
            children.add(pid.get(i++));
        }
        
        q.offer(kill);
        shouldKill.add(kill);
        while(!q.isEmpty()) {
            int t = q.poll();
            List<Integer> children = childrenMap.get(t);
            if(children != null) {
                for(int c : children) {
                    q.add(c);
                    shouldKill.add(c);
                }                
            }
        }
        return shouldKill;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容