这道题很神奇,有些case输入,concele出不来结果,但是目前这个思路肯定是对的,33/39,但是依旧超时了,很尴尬。本质上就是一个深度优先遍历。不知道咋加速呢。。。
class Solution {
public:
//总共有n个人,id从0-(n-1); headID就是起始迭代位置。
// manager: 每个员工的老板,manager[headID] = -1
// 从headID开始,层层通知一个新闻,
// informTime:第i个人需要这么长时间去通知下一个人
// 返回值,通知完每个人需要多少时间呢?
// 就是树的深度优先遍历-DFS
int numOfMinutes(int n, int headID, vector<int>& manager, vector<int>& informTime) {
int maxtime = 0;
int flag = 0;
for(int i=0;i<manager.size();i++){
if (headID==manager[i]){
maxtime = max(maxtime, numOfMinutes(n, i, manager, informTime));
flag = 1;
}
}
if (flag == 1){
maxtime += informTime[headID];
}
return maxtime;
}
};
终于ac了,果然dfs是最快的,但是处理的时候,我直接把vector managers转成map,使得最后查找的时候更快了,就直接ac了。
class Solution {
public:
//总共有n个人,id从0-(n-1); headID就是起始迭代位置。
// manager: 每个员工的老板,manager[headID] = -1
// 从headID开始,层层通知一个新闻,
// informTime:第i个人需要这么长时间去通知下一个人
// 返回值,通知完每个人需要多少时间呢?
// 就是树的深度优先遍历-DFS
int dfs(int headID, map<int, vector<int>>& manager2id, vector<int>& informTime){
int maxtime = 0;
int flag = 0;
vector<int> subids = manager2id[headID];
for(int i=0;i<subids.size();i++){
if (subids[i]!=-1){
maxtime = max(maxtime, dfs(subids[i], manager2id, informTime));
flag = 1;
}
}
if (flag == 1){
maxtime += informTime[headID];
}
return maxtime;
}
int numOfMinutes(int n, int headID, vector<int>& manager, vector<int>& informTime) {
// convert manager to map for quick searach
map<int, vector<int>> manager2id;
for(int i=0;i<manager.size();i++){
int key = manager[i];
int val = i;
if (manager2id.find(key) == manager2id.end()){
vector<int> temp(1, val);
manager2id[key] = temp;
}
else{
manager2id[key].push_back(val);
}
}
int maxtime = dfs(headID, manager2id, informTime);
return maxtime;
}
};