簡體   English   中英

DFS + Memoized 解決方案在 LeetCode 上獲取 TLE

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM