我正试图利用DFS处理LeetCode问题。 由此可见,使用实例变量比当地变量多出空间。
我的守则是:
http://www.ohchr.org。
class Solution {
public:
void dfs(int node, int parent, int& counter, vector<int>& low, vector<int>& id_to_rank, vector<vector<int>>& edges, vector<vector<int>>& ans){
id_to_rank[node] = counter;
low[node] = counter;
counter++;
for (const auto& e : edges[node]){
if (parent == e) continue;
if (id_to_rank[e] == -1){
dfs(e, node, counter, low, id_to_rank, edges, ans);
low[node] = min(low[node], low[e]);
if (low[e] > id_to_rank[node]){
ans.push_back({e, node});
}
}else{
low[node] = min(low[node], low[e]);
}
}
return;
}
vector<vector<int>> criticalConnections(int n, vector<vector<int>>& connections) {
vector<vector<int>> edges(n);
vector<int> id_to_rank (n, -1);
vector<int> low(n);
vector<vector<int>> ans;
int counter = 0;
for (const auto& c : connections){
edges[c[0]].push_back(c[1]);
edges[c[1]].push_back(c[0]);
}
dfs(0, -1, counter, low, id_to_rank, edges, ans);
return ans;
}
};
<<>Instance
class Solution {
public:
vector<vector<int>> ans;
int counter = 0;
void dfs(int node, int parent, vector<int>& low, vector<int>& id_to_rank, vector<vector<int>>& edges){
id_to_rank[node] = counter;
low[node] = counter;
counter++;
for (const auto& e : edges[node]){
if (parent == e) continue;
if (id_to_rank[e] == -1){
dfs(e, node, low, id_to_rank, edges);
low[node] = min(low[node], low[e]);
if (low[e] > id_to_rank[node]){
ans.push_back({e, node});
}
}else{
low[node] = min(low[node], low[e]);
}
}
return;
}
vector<vector<int>> criticalConnections(int n, vector<vector<int>>& connections) {
vector<vector<int>> edges(n);
vector<int> id_to_rank (n, -1);
vector<int> low(n);
for (const auto& c : connections){
edges[c[0]].push_back(c[1]);
edges[c[1]].push_back(c[0]);
}
dfs(0, -1, low, id_to_rank, edges);
return ans;
}
};
我多次重新提出解决办法,差额不变(约10%的记忆)。 我的猜测是,LeetCode在每一个试验场都使用同样的物体,因此是不同的。 但即便如此,我仍然不知道究竟发生了什么。
为什么使用实例变量比莱特居地的当地变量要多记忆?
(这是我第一次提出疑问,如果存在我不了解的任何规则,我就知道)