leetcode582,杀死进程。之前的帖子C数据结构-并查集介绍过并查集的用途,这道题是升级版本,每个进程有个父进程,指定杀死节点kill,那么他下面的子子孙孙也会被一并杀死。需要给出啥子某个指定节点后,具体哪些节点会被杀死。
1、在查找团队大哥的函数上需要优化。**如果发现某个小弟大哥是kill了,就不要继续向上找了,到此为止。**这样保证记录的数组中,一旦大佬是kill的,都标识成了kill。
2、完全没有get到并查集可以这么玩,可以定义到130000这么大
3、要了解什么时候tmp[pid[i]] = y;的心理,因为pid[i]必然低于ppid[i]一个位置,除非pid当前的老板不是kill,那么就可以进行这样处理了。
x = getleader(pid[i]);
y = getleader(ppid[i]);
if (x != y && x != g_kill) {
tmp[pid[i]] = y;
}
if (pid[i] == g_kill) {
tmp[pid[i]] = g_kill;
}
如下是getleader函数
int getleader(int curr) {
int son = curr;
while (tmp[curr] != -1) {
if (curr == g_kill) {
tmp[curr] = curr;
break;
}
curr = tmp[curr];
}
int tmpinfo;
while (tmp[son] != -1) {
if (son == g_kill) {
break;
}
tmpinfo = tmp[son];
tmp[son] = curr;
son = tmpinfo;
}
return curr;
}
如下是题目要求的函数
int* killProcess(int* pid, int pidSize, int* ppid, int ppidSize, int kill, int* returnSize) {
int i, count, x, y;
g_kill = kill;
for (i = 0; i < MAXLEN; i++) {
tmp[i] = -1;
}
for (i = 0; i < ppidSize; i++) {
x = getleader(pid[i]);
y = getleader(ppid[i]);
if (x != y && x != g_kill) {
tmp[pid[i]] = y;
}
if (pid[i] == g_kill) {
tmp[pid[i]] = g_kill;
}
}
for (i = 0; i < ppidSize; i++) {
getleader(pid[i]);
}
count = 0;
for (i = 0; i < ppidSize; i++) {
if (tmp[pid[i]] == g_kill) {
count++;
}
}
*returnSize = count;
int* ret = (int*)malloc(sizeof(int) * count);
count = 0;
for (i = 0; i < ppidSize; i++) {
if (tmp[pid[i]] == g_kill) {
ret[count++] = pid[i];
}
}
return ret;
}