1. 程式人生 > >582 Kill Process

582 Kill Process

parent note 哈希 and 代碼 i++ style key contains

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. Example 1: Input: pid = [1, 3, 10, 5] ppid = [3, 0, 5, 3] kill = 5 Output: [5,10] Explanation: 3 / 1 5 / 10 Kill 5 will also kill 10. Note: The given kill id is guaranteed to be one of the given PIDs. n >= 1
.

題目給了我們兩個數組,一個是進程的數組,還有一個是進程數組中的每個進程的父進程組成的數組。題目中說結束了某一個進程,其所有的子進程都需要結束,由於一個進程可能有多個子進程,所以我們首先要理清父子進程的關系。所以我們使用一個哈希表,建立進程和其所有子進程之間的映射,然後我們首先把要結束的進程放入一個隊列queue中,然後while循環,每次取出一個進程,將其加入結果res中,然後遍歷其所有子進程,將所有子進程都排入隊列中,這樣我們就能結束所有相關的進程,參見代碼如下:

public List<Integer> killall(HashMap<Integer, ArrayList<Integer>> map, int kill) {
        ArrayList<Integer> ans = new ArrayList<Integer>();
        ans.add(kill);
        ArrayList<Integer> list = map.get(kill);
        if (null == list)
            return ans;
        for (int i = 0; i < list.size(); i++) {
            ans.addAll(killall(map, list.get(i)));
        }
        return ans;
    }
    public List<Integer> killProcess(List<Integer> pid, List<Integer> ppid, int kill) {
        ArrayList<Integer> ans = new ArrayList<Integer>();
        ans.add(kill);
        HashMap<Integer, ArrayList<Integer>> map = new HashMap<Integer, ArrayList<Integer>>();
        for (int i = 0; i < ppid.size(); i++) {
            if (!map.containsKey(ppid.get(i))) {
                ArrayList<Integer> list = new ArrayList<Integer>();
                list.add(pid.get(i));
                map.put(ppid.get(i), list);
            }
            else {
                map.get(ppid.get(i)).add(pid.get(i));
            }
        }
        return killall(map, kill);
    }

  

582 Kill Process