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 killProcess(List pid, List ppid, int kill) {
        List shouldKill = recur(pid, ppid, kill);
        shouldKill.add(kill);
        return shouldKill;
    }

    public List recur(List pid, List ppid, int kill) {
        List 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 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 killProcess(List pid, List ppid, int kill) {
        Queue q = new LinkedList<>();
        List 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 killProcess(List pid, List ppid, int kill) {
        Queue q = new LinkedList<>();
        List shouldKill = new ArrayList<>();
        Map> childrenMap = new HashMap>();
        
        int i = 0;
        for(int p : ppid) {
            List 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 children = childrenMap.get(t);
            if(children != null) {
                for(int c : children) {
                    q.add(c);
                    shouldKill.add(c);
                }                
            }
        }
        return shouldKill;
    }
}

你可能感兴趣的:(Kill Process)