深度优先搜索LeetCode 690 Employee Importance

LeetCode 690

Employee Importance

  • Problem Description:
    题目给出一个结构体(id, importance, subordinates),其中,id唯一标识一个人,importance标识该人的重要程度,subordinates表示该人的直接下属(不包括间接下属)。题目给出特定id代表上司的id号,要求返回该上司及其所有下属的importance的和。
    具体的题目信息:
    https://leetcode.com/problems/employee-importance/description/
  • Solution: 采用栈辅助实现深度优先搜索
/*
// Employee info
class Employee {
public:
    // It's the unique ID of each node.
    // unique id of this employee
    int id;
    // the importance value of this employee
    int importance;
    // the id of direct subordinates
    vector<int> subordinates;
};
*/
class Solution {
public:
    int getImportance(vector<Employee*> employees, int id) {
        int num[2000];
        //使用数组标记是否有重复下属
        int sum = 0;
        memset(num, 0, 2000*sizeof(int));
        stack<int> sub;
        for (int i = 0; i < employees.size(); i++) {
            if (employees[i]->id == id) {
                sum += employees[i]->importance;
                if (employees[i]->subordinates.size()==0) break;
                for (int j = 0; j < employees[i]->subordinates.size(); j++) {
                    cout << employees[i]->subordinates[j] << endl;
                    sub.push(employees[i]->subordinates[j]);
                }
                break;
            }
        }
        int *p = &sum;
        //这里很重要,子函数若要对父函数进行修改,需要传更高一级的值,比如若要对常数进行修改,要传指针!!!
        getAllsubordinates(sub, employees, num, p);
        return sum;
    }
    void getAllsubordinates(stack<int> sub, vector<Employee*> employees, int num[2000], int* p) {
        if (sub.empty()) {
            return;
        } else {
            int id = sub.top();
            sub.pop();
            for (int i = 0; i < employees.size(); i++) {
                if (id == employees[i]->id) {
                    if (num[id] == 0) {
                        num[id] = 1;
                        *p += employees[i]->importance;
                        if (employees[i]->subordinates.size()==0) break;
                        for (int j = 0; j < employees[i]->subordinates.size(); j++) {
                            sub.push(employees[i]->subordinates[j]);
                        }
                        break;
                    } else {
                        break;
                    }
                }
            }
            getAllsubordinates(sub, employees, num, p);
        }
    }
};

想要在子函数中修改main函数中变量的值,需要传更高一级的变量到子函数。例如,改变普通变量的值,需要传一级指针;改变一级指针的值需要传二级指针等等。

猜你喜欢

转载自blog.csdn.net/shey666/article/details/80775633