LeetCode刷题22-杀死进程

import org.apache.dubbo.common.utils.CollectionUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 功能描述 HashMap+递归
 *
 * @author ASUS
 * @version 1.0
 * @Date 2022/8/24
 */
public class Main05 {
    public static void main(String[] args) {
        /*
        给 n 个进程,每个进程都有一个独一无二的 PID (进程编号)和它的 PPID (父进程编号)。
        每一个进程只有一个父进程,但是每个进程可能会有一个或者多个孩子进程。它们形成的关系就像一个树状结构。只有一个进程的 PPID 是 0 ,意味着这个进程没有父进程。我们用两个序列来表示这些进程,第一个序列包含所有进程的 PID ,第二个序列包含所有进程对应的 PPID。
        现在给定这两个序列和一个 PID表示你要杀死的进程,函数返回一个 PID 序列,表示因为杀这个进程而导致的所有被杀掉的进程的编号。当一个进程被杀掉的时候,它所有的孩子进程和后代进程都要被杀掉。
        你可以以任意顺序排列返回的 PID 序列。
        注意:
       (1)被强制关闭的进程编号一定在 PID 序列中。
       (2)PID 序列个数>= 1,PPID 的个数与 PID 相等。
       (3)必须考虑大的数据量情况下的性能,时间复杂度为 O(n^2)的解法通过的用例会很少。

        示例 1:
        输入:
        pid = [1, 3, 10, 5]
        ppid = [3, 0, 5, 3]
        kill = 3
        输出: [1,3,5,10]
        */
        List<Integer> pid = new ArrayList<>(4);
        pid.add(1);
        pid.add(3);
        pid.add(10);
        pid.add(5);
        List<Integer> ppid = new ArrayList<>(4);
        ppid.add(3);
        ppid.add(0);
        ppid.add(5);
        ppid.add(3);
        List<Integer> collect = killeProcess(pid, ppid, 3).stream().distinct().sorted().collect(Collectors.toList());
        System.out.println(collect);
    }


    public static List<Integer> killeProcess(List<Integer> pid, List<Integer> ppid, int kill) {
        HashMap<Integer, List<Integer>> hashMap = new HashMap<>(4);
        for (int i = 0; i < ppid.size(); i++) {
            Integer integer = ppid.get(i);
            if (CollectionUtils.isNotEmpty(hashMap.get(integer))) {
                hashMap.get(integer).add(pid.get(i));
                continue;
            }
            LinkedList<Integer> list = new LinkedList<>();
            list.add(pid.get(i));
            hashMap.put(ppid.get(i), list);
        }

        // kill
        LinkedList<Integer> killList = new LinkedList<>();
        getKill(killList, hashMap, kill);
        return killList;
    }

    private static void getKill(LinkedList<Integer> killList, HashMap<Integer, List<Integer>> hashMap, int kill) {
        killList.add(kill);
        List<Integer> integerList = hashMap.get(kill);
        if (CollectionUtils.isNotEmpty(integerList)) {
            killList.addAll(integerList);
            for (Integer pid : integerList) {
                getKill(killList, hashMap, pid);
            }
        }
    }
}

 

posted @ 2022-08-23 22:22  chch213  阅读(62)  评论(0编辑  收藏  举报