[英]DFS + Memoized solution getting TLE on LeetCode
我试图在 LeetCode的比赛(现已完成)中解决这个问题。
在一组 N 人(标记为 0、1、2、...、N-1)中,每个人的钱数不同,安静程度也不同。
为方便起见,我们将标签为 x 的人称为“人 x”。
我们会说richer[i] = [x, y] 如果人x 肯定比人y 有更多的钱。 请注意,更丰富的可能只是有效观察的一个子集。
此外,如果人 x 有安静度 q,我们会说 quiet[x] = q。
现在,返回答案,其中 answer[x] = y 如果 y 是最不安静的人(即安静 [y] 值最小的人 y),在所有钱肯定等于或多于人的人中X。
示例 1:
输入:更丰富 = [[1,0],[2,1],[3,1],[3,7],[4,3],[5,3],[6,3]], quiet = [3,2,5,4,6,1,7,0] 输出:[5,5,2,5,4,5,6,7] 解释:answer[0] = 5。第 5 个人有更多的钱比3,钱比1多,钱比0多。唯一安静的人(安静[x]较低)是人7,但不清楚他们是否比人0钱多。
答案[7] = 7. 在所有钱肯定等于或大于第 7 个人(可能是第 3、4、5、6 或 7 个人)的人中,最安静的人(安静 [x ]) 是第 7 个人。
其他答案可以用类似的推理来填写。
输入中没有循环。
这看起来像一个简单的 DFS 问题,我们跟踪路径中节点的quietness
度。
我的解决方案是这样的
class Solution {
public:
int doDFS(unordered_map<int, bool>& visited,
unordered_map<int, vector<int> > graph, vector<int>& quiet,
vector<int>& answer, int current) {
if (visited.find(current) != visited.end()) {
return answer[current];
}
int current_min = current;
for (int i = 0; i < graph[current].size(); ++i) {
int min_y = doDFS(visited, graph, quiet, answer, graph[current][i]);
if (quiet[current_min] > quiet[min_y]) {
current_min = min_y;
}
}
answer[current] = current_min;
visited[current] = true;
return answer[current];
}
vector<int> loudAndRich(vector<vector<int> >& richer, vector<int>& quiet) {
// vector<vector<int>> graph(quiet.size(), vector<int>());
unordered_map<int, vector<int> > graph;
vector<int> answer(quiet.size());
unordered_map<int, bool> visited;
for (int i = 0; i < richer.size(); ++i) {
// cout << richer[i][1] << ' ' << richer[i][0] << endl;
if (graph.find(richer[i][1]) == graph.end()) {
graph.insert({richer[i][1], vector<int>{richer[i][0]}});
} else {
graph[richer[i][1]].push_back(richer[i][0]);
}
}
for (int i = 0; i < quiet.size(); ++i) {
if (visited.find(i) == visited.end()) {
doDFS(visited, graph, quiet, answer, i);
}
}
return answer;
}
};
但是我无法接受它,它会因更大的输入而超时。 这个解决方案的运行时间是O(N)
因为我们只访问每个节点一次。
有人可以帮助我了解为什么会超时吗?
将unordered_map<int, vector<int> > graph
更改为unordered_map<int, vector<int> > &graph
,您在每次调用时都会制作一份副本,这会给您带来好处。 随着这种变化,它被接受。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.