DFS + Memoized解决方案在LeetCode上获得TLE

时间:2018-06-10 04:59:53

标签: c++ algorithm graph dfs

我试图在比赛(现已完成)on LeetCode中解决此问题。

  

在一组N人(标记为0,1,2,...,N-1)中,每个人都有   不同数额的金钱,以及不同程度的安静。

     

为方便起见,我们会打电话给标签为x的人,简单地称为#34; person   X"

     

我们会说富人[i] = [x,y]如果人x肯定有更多   钱比人y。请注意,richer可能只是有效的子集   观察结果。

     

另外,如果人x有安静q,我们会说安静[x] = q。

     

现在,回答答案,如果y是最不安静的人,则回答[x] = y   (也就是说,安静[y]值最小的人y)   绝对拥有与人x相等或更多钱的人。

     

示例1:

     

输入:更丰富= [[1,0],[2,1],[3,1],[3,7],[4,3],[5,3],[6,3]] ,安静=   [3,2,5,4,6,1,7,0]输出:[5,5,2,5,4,5,6,7]说明:回答[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),因为我们只访问每个节点一次。

有人可以帮我解释为什么这会超时吗?

1 个答案:

答案 0 :(得分:1)

unordered_map<int, vector<int> > graph更改为unordered_map<int, vector<int> > &graph,您正在为每次通话复制一份。随着这种变化,它被接受。